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 }