1 #include <cstdio>
2 #include <cstring>
3 #include <iostream>
4 #include <algorithm>
5 #include <map>
6 using namespace std;
7
8 const int MAXN = 100010;
9
10 int child[MAXN][2], size[MAXN], add[MAXN], wage[MAXN];
11 int n, minWage, ncnt;
12
13 inline int newNode(int k) {
14 size[ncnt] = 1;
15 wage[ncnt] = k;
16 return ncnt++;
17 }
18
19 inline void update(int &x) {
20 size[x] = size[child[x][0]] + size[child[x][1]] + 1;
21 }
22
23 inline void pushdown(int &x) {
24 if(add[x]) {
25 add[child[x][0]] += add[x];
26 add[child[x][1]] += add[x];
27 wage[x] += add[x];
28 add[x] = 0;
29 }
30 }
31
32 inline void rotate(int &x, int t) {
33 int y = child[x][t];
34 child[x][t] = child[y][t ^ 1];
35 child[y][t ^ 1] = x;
36 update(x), update(y);
37 x = y;
38 }
39
40 void splay(int &x, int k) {
41 pushdown(x);
42 if(k == size[child[x][0]] + 1) return ;
43 int t = k > size[child[x][0]];
44 if(t == 1) k -= size[child[x][0]] + 1;
45 int p = child[x][t];
46 pushdown(p);
47 int t2 = k > size[child[p][0]];
48 int k2 = (t2 == 0 ? k : k - size[child[p][0]] - 1);
49 if(k != size[child[p][0]] + 1) {
50 splay(child[p][t2], k2);
51 if(t == t2) rotate(x, t);
52 else rotate(child[x][t], t ^ 1);
53 }
54 rotate(x, t);
55 }
56
57 int lower_count(int &x, int val) {
58 if(x == 0) return 0;
59 pushdown(x);
60 if(val <= wage[x]) return lower_count(child[x][0], val);
61 return size[child[x][0]] + 1 + lower_count(child[x][1], val);
62 }
63
64 inline int merge(int left, int right) {
65 splay(left, size[left]);
66 child[left][1] = right;
67 update(left);
68 return left;
69 }
70
71 inline void split(int x, int k, int &left, int &right) {
72 splay(x, k);
73 left = x;
74 right = child[x][1];
75 child[x][1] = 0;
76 update(left);
77 }
78
79 inline void insert(int &x, int k) {
80 int t = lower_count(x, k);
81 if(t > 0) {
82 int left, right;
83 split(x, t, left, right);
84 x = merge(merge(left, newNode(k)), right);
85 } else x = merge(newNode(k), x);
86 }
87
88 int main() {
89 scanf("%d%d", &n, &minWage);
90 int root = 0, ans = 0;
91 ncnt = 1;
92 for(int i = 0; i < n; ++i) {
93 char c;
94 int k;
95 scanf(" %c%d", &c, &k);
96 if(c == 'I') {
97 if(k >= minWage) {
98 if(root == 0) root = newNode(k);
99 else insert(root, k);
100 } //else ++ans;
101 };
102 if(c == 'A') {
103 add[root] += k;
104 };
105 if(c == 'S') {
106 add[root] -= k;
107 int t = lower_count(root, minWage);
108 if(t > 0) {
109 int left, right;
110 split(root, t, left, right);
111 ans += size[left];
112 root = right;
113 }
114 };
115 if(c == 'F') {
116 if(k > size[root]) puts("-1");
117 else {
118 splay(root, size[root] - k + 1);
119 printf("%d\n", wage[root]);
120 }
121 };
122 }
123 printf("%d\n", ans);
124 }