1 #include<cstdio>
  2 #define INF 0x7FFFFFFF
  3 #define MAXN 100010
  4 struct SplayTree {
  5     int num[MAXN], next[MAXN][2], pre[MAXN], key[MAXN];
  6     int root, size;
  7     inline void PushUp(int x) {
  8         num[x] = num[next[x][0]] + num[next[x][1]] + 1;
  9     }
 10     inline void Rotate(int x, int kind) {
 11         int y, z;
 12         y = pre[x];
 13         z = pre[y];
 14         next[y][!kind] = next[x][kind];
 15         pre[next[x][kind]] = y;
 16         next[z][next[z][1] == y] = x;
 17         pre[x] = z;
 18         next[x][kind] = y;
 19         pre[y] = x;
 20         PushUp(y);
 21         PushUp(x);
 22     }
 23     void Splay(int x, int goal) {
 24         if (x != goal) {
 25             while (pre[x] != goal) {
 26                 if (next[pre[x]][0] == x)
 27                     Rotate(x, 1);
 28                 else
 29                     Rotate(x, 0);
 30             }
 31             if (!goal)
 32                 root = x;
 33         }
 34     }
 35     inline void NewNode(int &x, int y, int val) {
 36         x = ++size;
 37         num[x] = 1;
 38         pre[x] = y;
 39         next[x][0] = next[x][1] = 0;
 40         key[x] = val;
 41         next[y][val > key[y]] = x;
 42     }
 43     void Insert(int val) {
 44         int x, y;
 45         for (x = root, y = 0; x; x = next[x][val > key[x]]) {
 46             y = x;
 47             num[x]++;
 48         }
 49         NewNode(x, y, val);
 50         Splay(x, 0);
 51     }
 52     int Search(int val) {
 53         int res, x;
 54         for (res = 0, x = root; x; x = next[x][val > key[x]]) {
 55             if (key[x] >= val && key[res] >= key[x])
 56                 res = x;
 57         }
 58         return res;
 59     }
 60     int Select(int k) {
 61         int x;
 62         k = num[root] - k;
 63         for (x = root; num[next[x][0]] + 1 != k;) {
 64             if (num[next[x][0]] + 1 < k) {
 65                 k -= num[next[x][0]] + 1;
 66                 x = next[x][1];
 67             } else
 68                 x = next[x][0];
 69         }
 70         Splay(x, 0);
 71         return key[x];
 72     }
 73     inline void Init() {
 74         root = size = 0;
 75         num[0] = next[0][0] = next[0][1] = pre[0];
 76         key[0] = INF;
 77         Insert(INF);
 78     }
 79 } tree;
 80 int main() {
 81     char ch;
 82     int q, base, diff, ans, x;
 83     while (~scanf("%d%d", &q, &base)) {
 84         tree.Init();
 85         diff = ans = 0;
 86         while (q--) {
 87             scanf(" %c%d", &ch, &x);
 88             if (ch == 'I') {
 89                 if (x >= base)
 90                     tree.Insert(x - base + diff);
 91             } else if (ch == 'A')
 92                 diff -= x;
 93             else if (ch == 'S') {
 94                 diff += x;
 95                 tree.Splay(tree.Search(diff), 0);
 96                 ans += tree.num[tree.next[tree.root][0]];
 97                 tree.num[tree.root] -= tree.num[tree.next[tree.root][0]];
 98                 tree.next[tree.root][0] = 0;
 99             } else {
100                 if (x >= tree.num[tree.root])
101                     puts("-1");
102                 else
103                     printf("%d\n", tree.Select(x) + base - diff);
104             }
105         }
106         printf("%d\n", ans);
107     }
108     return 0;
109 }
posted on 2012-08-12 20:00  DrunBee  阅读(616)  评论(0编辑  收藏  举报