1 #include<cstdio> 2 #include<cstdlib> 3 #include<ctime> 4 struct shu 5 { 6 int l,r,sum,zhi,dui; 7 }a[100005]; 8 int n,xia,root,size,lei,leave; 9 char ch[2]; 10 void you(int &a1) 11 { 12 int t=a[a1].l; 13 a[a1].l=a[t].r; 14 a[t].r=a1; 15 a[t].sum=a[a1].sum; 16 a[a1].sum=a[a[a1].l].sum+a[a[a1].r].sum+1; 17 a1=t; 18 return; 19 } 20 void zuo(int &a1) 21 { 22 int t=a[a1].r; 23 a[a1].r=a[t].l; 24 a[t].l=a1; 25 a[t].sum=a[a1].sum; 26 a[a1].sum=a[a[a1].l].sum+a[a[a1].r].sum+1; 27 a1=t; 28 return; 29 } 30 void jia(int &a1,int a2) 31 { 32 if(a1==0) 33 { 34 size++; 35 a1=size; 36 a[a1].sum=1; 37 a[a1].zhi=a2; 38 a[a1].dui=rand(); 39 return; 40 } 41 a[a1].sum++; 42 if(a2<a[a1].zhi) 43 { 44 jia(a[a1].l,a2); 45 if(a[a[a1].l].dui<a[a1].dui) 46 you(a1); 47 } 48 else 49 { 50 jia(a[a1].r,a2); 51 if(a[a[a1].r].dui<a[a1].dui) 52 zuo(a1); 53 } 54 return; 55 } 56 int shan(int &a1,int a2) 57 { 58 if(a1==0) 59 return 0; 60 int t; 61 if(a[a1].zhi<a2) 62 { 63 t=a[a[a1].l].sum+1; 64 a1=a[a1].r; 65 return t+shan(a1,a2); 66 } 67 t=shan(a[a1].l,a2); 68 a[a1].sum-=t; 69 return t; 70 } 71 int zhao(int a1,int a2) 72 { 73 if(a[a[a1].r].sum+1==a2) 74 return a[a1].zhi; 75 if(a[a[a1].r].sum>=a2) 76 return zhao(a[a1].r,a2); 77 else 78 return zhao(a[a1].l,a2-a[a[a1].r].sum-1); 79 } 80 int main() 81 { 82 root=size=0; 83 scanf("%d%d",&n,&xia); 84 for(int i=0;i<n;i++) 85 { 86 int a1; 87 scanf("%s%d",ch,&a1); 88 if(ch[0]=='I') 89 if(a1>=xia) 90 jia(root,a1-lei); 91 if(ch[0]=='A') 92 lei+=a1; 93 if(ch[0]=='S') 94 { 95 lei-=a1; 96 leave+=shan(root,xia-lei); 97 } 98 if(ch[0]=='F') 99 { 100 if(a1>a[root].sum) 101 printf("-1\n"); 102 else 103 printf("%d\n",zhao(root,a1)+lei); 104 } 105 } 106 printf("%d\n",leave); 107 return 0; 108 }
平衡树 treap