[bzoj3223]文艺平衡树[splay]

  //BY HZWER
1
#include<iostream> 2 #include<cstdio> 3 4 using namespace std; 5 6 inline int read() 7 { 8 int x=0,f=1;char ch=getchar(); 9 while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} 10 while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} 11 return x*f; 12 } 13 14 int n,m,sz,rt; 15 int fa[100005],c[100005][2],id[100005]; 16 int size[100005]; 17 bool rev[100005]; 18 19 void pushup(int k) 20 { 21 int l=c[k][0],r=c[k][1]; 22 size[k]=size[l]+size[r]+1; 23 } 24 25 void pushdown(int k) 26 { 27 int l=c[k][0],r=c[k][1]; 28 29 if(rev[k]) 30 { 31 swap(c[k][0],c[k][1]); 32 rev[l]^=1;rev[r]^=1; 33 rev[k]=0; 34 } 35 } 36 37 void rotate(int x,int &k) 38 { 39 int y=fa[x],z=fa[y],l,r; 40 41 if(c[y][0]==x)l=0;else l=1;r=l^1; 42 if(y==k)k=x; 43 else {if(c[z][0]==y)c[z][0]=x;else c[z][1]=x;} 44 45 fa[x]=z;fa[y]=x;fa[c[x][r]]=y; 46 c[y][l]=c[x][r];c[x][r]=y; 47 pushup(y);pushup(x); 48 } 49 50 void splay(int x,int &k) 51 { 52 while(x!=k) 53 { 54 int y=fa[x],z=fa[y]; 55 if(y!=k) 56 { 57 if((c[y][0]==x)^(c[z][0]==y))rotate(x,k); 58 else rotate(y,k); 59 } 60 61 rotate(x,k); 62 } 63 } 64 65 int find(int k,int rank) 66 { 67 pushdown(k); 68 int l=c[k][0],r=c[k][1]; 69 70 if(size[l]+1==rank)return k; 71 else if(size[l]>=rank)return find(l,rank); 72 else return find(r,rank-size[l]-1); 73 } 74 75 void rever(int l,int r) 76 { 77 int x=find(rt,l),y=find(rt,r+2); 78 splay(x,rt);splay(y,c[x][1]); 79 int z=c[y][0]; 80 rev[z]^=1; 81 } 82 83 void build(int l,int r,int f) 84 { 85 if(l>r)return; 86 int now=id[l],last=id[f]; 87 88 if(l==r) 89 { 90 fa[now]=last;size[now]=1; 91 if(l<f)c[last][0]=now; 92 else c[last][1]=now; 93 return; 94 } 95 96 int mid=(l+r)>>1;now=id[mid]; 97 98 build(l,mid-1,mid);build(mid+1,r,mid); 99 fa[now]=last;pushup(mid); 100 101 if(mid<f)c[last][0]=now; 102 else c[last][1]=now; 103 } 104 105 int main() 106 { 107 n=read();m=read(); 108 109 for(int i=1;i<=n+2;i++) 110 id[i]=++sz; 111 112 build(1,n+2,0);rt=(n+3)>>1; 113 114 for(int i=1;i<=m;i++) 115 { 116 int l=read(),r=read(); 117 rever(l,r); 118 } 119 120 for(int i=2;i<=n+1;i++) 121 printf("%d ",find(rt,i)-1); 122 123 return 0; 124 }

 

posted @ 2015-12-31 02:26  Gster  阅读(166)  评论(0编辑  收藏  举报