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

posted on 2016-03-13 06:36  xiyuedong  阅读(143)  评论(0编辑  收藏  举报