只过 #1 #3 #8,其余 WA
#include <bits/stdc++.h>
#define ll long long
using namespace std;
ll n, minn, x, rt, idex, tot, lft, cnt;
char op;
struct st
{
ll fa, son[2], v, cnt, sz;
void init(ll f, ll vv)
{
fa = f, v = vv;
cnt = sz = 1;
}
}tr[300005];
void pushup(ll x)
{
tr[x].sz = tr[tr[x].son[0]].sz + tr[tr[x].son[1]].sz + tr[x].cnt;
}
void rotate(ll x)
{
ll y = tr[x].fa, z = tr[y].fa;
if (tr[y].son[0] == x) // right-shift
{
tr[y].son[0] = tr[x].son[1];
tr[tr[x].son[1]].fa = y;
tr[x].son[1] = y;
tr[y].fa = x;
tr[z].son[tr[z].son[1] == y] = x;
tr[x].fa = z;
}
else //left-shift
{
tr[y].son[1] = tr[x].son[0];
tr[tr[x].son[0]].fa = y;
tr[x].son[0] = y;
tr[y].fa = x;
tr[z].son[tr[z].son[1] == y] = x;
tr[x].fa = z;
}
pushup(y), pushup(x);
}
void splay(ll x, ll k)
{
while (tr[x].fa != k)
{
ll y = tr[x].fa, z = tr[y].fa;
if (k != z)
{
if ((tr[y].son[0] == x) + (tr[z].son[0] == y) == 1) rotate(x);
else rotate(y);
}
rotate(x);
}
if (k == 0) rt = x;
}
void find(ll v)
{
ll now = rt;
while (tr[now].son[v > tr[now].v] && tr[now].v != v) now = tr[now].son[v > tr[now].v];
splay(now, 0);
}
ll get_pre(ll v)
{
find(v);
if (tr[rt].v < v) return rt;
ll now = tr[rt].son[0];
while (tr[now].son[1]) now = tr[now].son[1];
splay(now, 0);
return now;
}
ll get_nxt(ll v)
{
find(v);
if (tr[rt].v > v) return rt;
ll now = tr[rt].son[1];
while (tr[now].son[0]) now = tr[now].son[0];
splay(now, 0);
return now;
}
void ins(ll v)
{
ll now = rt, p = 0;
while (now && tr[now].v != v)
{
p = now;
now = tr[now].son[v > tr[now].v];
}
if (now) tr[now].cnt++;
else
{
now = ++idex;
tr[p].son[v > tr[p].v] = now;
tr[now].init(p, v);
}
splay(now, 0);
}
void del(ll v)
{
ll pre = get_pre(v), nxt = get_nxt(v);
splay(pre, 0), splay(nxt, pre);
ll now = tr[nxt].son[0];
if (tr[now].sz == 1) tr[nxt].son[0] = 0, splay(nxt, 0);
else tr[now].cnt--, splay(now, 0);
}
ll get_val(ll k)
{
ll now = rt;
while (1)
{
ll nxt = tr[now].son[0];
if (tr[nxt].sz + tr[now].cnt < k)
{
k -= tr[nxt].sz + tr[now].cnt;
now = tr[now].son[1];
}
else if (tr[nxt].sz >= k) now = nxt;
else break;
}
splay(now, 0);
return tr[now].v;
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0), cout.tie(0);
cin >> n >> minn;
ins(-1e18), ins(1e18);
while (n--)
{
cin >> op >> x;
if (op == 'I')
{
if (x - tot >= minn) ins(x - tot), lft++;
}
else if (op == 'A') minn -= x, tot += x;
else if (op == 'S')
{
minn += x, tot -= x;
ll p = tr[get_pre(minn - 1)].v;
while (p != -1e18)
{
del(p);
cnt++;
lft--;
p = tr[get_pre(minn - 1)].v;
}
}
else
{
if (x > lft) cout << -1 << endl;
else cout << get_val(lft - x + 2) + tot << endl;
}
}
cout << cnt;
}