文艺平衡树
文艺平衡树
第一次写
几乎没有看别人的代码就写过了
对于不会敲键盘的我来说很不容易
所以发表博客纪念一下
#include<stdio.h>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
#include<cmath>
#include<iostream>
#include<queue>
#include<string>
#include<ctime>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
typedef long double ld;
typedef unsigned long long ull;
typedef pair<long long,long long> pll;
#define fi first
#define se second
#define pb push_back
#define mp make_pair
#define rep(i,j,k) for(register int i=(int)(j);i<=(int)(k);i++)
#define rrep(i,j,k) for(register int i=(int)(j);i>=(int)(k);i--)
#define Debug(...) fprintf(stderr, __VA_ARGS__)
ll read(){
ll x=0,f=1;char c=getchar();
while(c<'0' || c>'9'){if(c=='-')f=-1;c=getchar();}
while(c>='0' && c<='9'){x=x*10+c-'0';c=getchar();}
return x*f;
}
const int maxn=100100;
int n,m,tot,root;
struct Node{
int l,r,val,sz,f;
int tag;
} tr[maxn<<1];
void update(int x){
tr[x].sz=tr[tr[x].l].sz+tr[tr[x].r].sz+1;
}
int build(int l,int r,int fa){
if(l==r){
tr[++tot].val=l;
tr[tot].sz=1;tr[tot].f=fa;
return tot;
}
int md=(l+r)>>1;
tr[++tot].val=md;tr[tot].f=fa;int nw=tot;
if(md>l) tr[nw].l=build(l,md-1,nw);
if(md<r) tr[nw].r=build(md+1,r,nw);
update(nw);
return nw;
}
bool get(int x){return tr[tr[x].f].r==x;}
void pushdown(int x){
if(tr[x].tag){
tr[tr[x].r].tag^=1;
tr[tr[x].l].tag^=1;
swap(tr[x].l,tr[x].r);
tr[x].tag=0;
}
}
void rot(int x){
int y=tr[x].f,z=tr[y].f;
pushdown(x);pushdown(y);
if(x==tr[y].l){
tr[y].l=tr[x].r;tr[tr[x].r].f=y;tr[x].r=y;tr[y].f=x;
}
else{
tr[y].r=tr[x].l;tr[tr[x].l].f=y;tr[x].l=y;tr[y].f=x;
}
tr[x].f=z;
if(z){
if(tr[z].l==y) tr[z].l=x;
else tr[z].r=x;
}
update(y);update(x);
}
void splay(int x,int goal){
for(int f=tr[x].f;(f=tr[x].f)!=goal;rot(x)){
if(tr[f].f!=goal){
if(get(x)==get(f)) rot(f); else rot(x);
}
}
if(!goal) root=x;
}
int fnd(int x){
int nw=root;
while(1){
pushdown(nw);
if(x<=tr[tr[nw].l].sz){
nw=tr[nw].l;
continue;
}
x-=tr[tr[nw].l].sz;x--;
if(!x) return nw;
nw=tr[nw].r;
}
}
void dfs(int x){
pushdown(x);
if(tr[x].l) dfs(tr[x].l);
if(tr[x].val!=0 && tr[x].val!=n+1) printf("%d ",tr[x].val);
if(tr[x].r) dfs(tr[x].r);
}
void work(){
n=read(),m=read();
root=build(0,n+1,0);
rep(i,1,m){
int l=read(),r=read();
l=fnd(l),r=fnd(r+2);
splay(l,0);
splay(r,l);
int pos=tr[tr[root].r].l;
tr[pos].tag^=1;
}
dfs(root);
puts("");
}
int main(){
#ifdef LZT
freopen("in","r",stdin);
#endif
work();
#ifdef LZT
Debug("My Time: %.3lfms\n", (double)clock() / CLOCKS_PER_SEC);
#endif
}