全TLE求调
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 300000 + 5;
struct tree {
int l, r, val, pty, sz;
} node[N * 4];
int n, mn, dl, dr, root, num, s, cnt;
void pushup(int x) {
node[x].sz = node[node[x].l].sz + node[node[x].r].sz + 1;
}
void split(int u, int & l, int & r, int val) {
if (!u) {
l = r = 0;
return;
}
if (node[u].val <= val) {
l = u;
split(node[u].r, node[u].r, r, val);
} else {
r = u;
split(node[u].l, l, node[u].l, val);
}
pushup(u);
}
int merge(int l, int r) {
if (!l || !r) {
return l + r;
}
if (node[l].pty <= node[r].pty) {
node[l].r = merge(node[l].r, r);
pushup(l);
return l;
} else {
node[r].l = merge(l, node[r].l);
pushup(r);
return r;
}
}
void add(int val) {
num++;
node[num].val = val;
node[num].pty = rand();
node[num].sz = 1;
}
void ins(int val) {
split(root, dl, dr, val);
add(val);
root = merge(merge(dl, num), dr);
}
int kth(int u, int p) {
if (p == node[node[u].l].sz + 1) {
return node[u].val;
} else if (p < node[node[u].l].sz + 1) {
p -= node[node[u].l].sz + 1;
return kth(node[u].r, p);
} else {
return kth(node[u].l, p);
}
}
int rnk(int val) {
split(root, dl, dr, val - 1);
root = dr;
return node[dl].sz;
}
signed main(void) {
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
srand(time(NULL));
cin >> n >> mn;
for (int i = 1; i <= n; i++) {
char opt;
int x;
cin >> opt >> x;
if (opt == 'I') {
if (x < mn) continue;
ins(x - s);
} else if (opt == 'A') {
s += x;
} else if (opt == 'S') {
s -= x;
cnt += rnk(mn - s);
} else {
if (node[root].sz < x) cout << -1 << "\n";
else cout << kth(root, node[root].sz - x + 1) + s<< "\n";
}
}
cout << cnt;
return 0;
}