BZOJ3065。
去年用pascal 块链过了。。
今年来试了试非旋treap大法 注定被块链完爆
代码留这。
第一份 :辣鸡的 垃圾回收做法 跑得极慢
1 #include <bits/stdc++.h> 2 #define M 70000 3 using namespace std; 4 struct W{int l,r,s,v,e;}a[70005]; 5 struct O{int l,r,s,k;}b[15000000]; 6 int nex[15000000],A[35005],n,m,rt,ans,l,r,x,k,t,c,T,d[70005]; char op[3]; 7 void CL(int u){ 8 if (!u) return; --b[u].k; 9 if (!b[u].k) nex[u]=t,t=u; 10 } 11 void NEW(int &u){ 12 int U=t; t=nex[t]; CL(u); 13 CL(b[U].l); CL(b[U].r); 14 b[U]=(O){b[u].l,b[u].r,b[u].s,1}; 15 u=U; ++b[b[u].l].k; ++b[b[u].r].k; 16 } 17 void add(int &u,int x,int p,int q,int X){ 18 NEW(u); b[u].s+=X; 19 if (p<q) 20 if (x<=p+q>>1) add(b[u].l,x,p,p+q>>1,X); 21 else add(b[u].r,x,(p+q>>1)+1,q,X); 22 if (!b[u].s) {nex[u]=t; t=u; u=0;} 23 } 24 void he(int &u,int v,int p,int q){ 25 if (!v) return; 26 if (!u) {++b[u=v].k; return;} 27 NEW(u); b[u].s+=b[v].s; 28 he(b[u].l,b[v].l,p,p+q>>1); 29 he(b[u].r,b[v].r,(p+q>>1)+1,q); 30 } 31 void up(int u){ 32 a[u].s=a[a[u].l].s+a[a[u].r].s+1; 33 CL(a[u].e); a[u].e=0; 34 add(a[u].e,a[u].v,0,M,1); 35 he(a[u].e,a[a[u].l].e,0,M); 36 he(a[u].e,a[a[u].r].e,0,M); 37 } 38 void build(int &u,int p,int q){ 39 if (p>q) return; 40 u=p+q>>1; a[u].v=A[u]; 41 build(a[u].l,p,u-1); 42 build(a[u].r,u+1,q); 43 up(u); 44 } 45 void split(int u,int k,int &l,int &r){ 46 if (!k) {l=0; r=u; return;} 47 if (k==a[u].s) {l=u; r=0; return;} 48 if (k<=a[a[u].l].s) split(a[u].l,k,l,a[u].l),up(r=u); 49 else split(a[u].r,k-a[a[u].l].s-1,a[u].r,r),up(l=u); 50 } 51 void join(int &u,int k){ 52 if ((1ll+a[u].s)*rand()<=RAND_MAX){ 53 int A,B; split(u,k,A,B); 54 a[T].l=A; a[T].r=B; up(u=T); 55 }else{ 56 if (k<=a[a[u].l].s) join(a[u].l,k); 57 else join(a[u].r,k-a[a[u].l].s-1); 58 add(a[u].e,a[T].v,0,M,1); ++a[u].s; 59 } 60 } 61 void mody(int u,int k){ 62 if (a[a[u].l].s+1==k) 63 r=a[u].v,a[u].v=l; else 64 if (k<=a[a[u].l].s) mody(a[u].l,k); 65 else mody(a[u].r,k-a[a[u].l].s-1); 66 add(a[u].e,r,0,M,-1); 67 add(a[u].e,l,0,M,1); 68 } 69 void find(int u,int l,int r){ 70 if (r<1||l>a[u].s) return; 71 if (l<=1&&a[u].s<=r) {d[++c]=a[u].e; return;} 72 if (l<=a[a[u].l].s+1&&a[a[u].l].s<r) 73 add(d[1],a[u].v,0,M,1); 74 find(a[u].l,l,r); 75 find(a[u].r,l-a[a[u].l].s-1,r-a[a[u].l].s-1); 76 } 77 int main(){ 78 srand(233); 79 scanf("%d",&n); 80 for (int i=1;i<=n;++i) scanf("%d",&A[i]); 81 for (int i=1;i<15000000;++i) nex[i]=i+1; 82 t=1; build(rt,1,n); T=n; 83 scanf("%d",&m); 84 while (m--){ 85 scanf("%s",op); 86 if (op[0]=='Q'){ 87 scanf("%d%d%d",&l,&r,&k); 88 l^=ans; r^=ans; k^=ans; 89 c=1; find(rt,l,r); 90 l=0; r=M; int tt=d[1]; 91 while (l<r){ 92 x=0; 93 for (int i=1;i<=c;++i) x+=b[b[d[i]].l].s; 94 if (x<k){ 95 l=(l+r>>1)+1; k-=x; 96 for (int i=1;i<=c;++i) d[i]=b[d[i]].r; 97 }else{ 98 r=l+r>>1; 99 for (int i=1;i<=c;++i) d[i]=b[d[i]].l; 100 } 101 } 102 CL(tt); d[1]=0; 103 printf("%d\n",ans=l); 104 }else 105 if (op[0]=='M'){ 106 scanf("%d%d",&k,&l); 107 l^=ans; k^=ans; 108 mody(rt,k); 109 }else{ 110 scanf("%d%d",&l,&k); 111 l^=ans; k^=ans; --l; 112 ++T; a[T].v=k; 113 join(rt,l); 114 } 115 } 116 return 0; 117 }