#include <bits/stdc++.h>
using namespace std;
struct treap
{
int l, r, siz, pri, key, val;
}a[100005];
int ans, ptot;
void push_up(int k)
{
a[k].siz = a[a[k].l].siz + a[a[k].r].siz + a[k].val;
}
void lturn(int &k)
{
int tmp = a[k].r;
a[k].r = a[tmp].l, a[tmp].l = k;
a[tmp].siz = a[k].siz, push_up(k), k = tmp;
}
void rturn(int &k)
{
int tmp = a[k].l;
a[k].l = a[tmp].r, a[tmp].r = k;
a[tmp].siz = a[k].siz, push_up(k), k = tmp;
}
void insert(int &k, int x)
{
if(!k)
{
k = ++ptot, a[k].siz = a[k].val = 1;
a[k].key = x, a[k].pri = rand();
return;
}
++a[k].siz;
if(x == a[k].key) ++a[k].val;
else if(x > a[k].key)
{
insert(a[k].l, x);
if(a[a[k].l].pri > a[k].pri) rturn(k);
}
else
{
insert(a[k].r, x);
if(a[a[k].r].pri > a[k].pri) lturn(k);
}
}
void del(int &k, int x)
{
if(!k) return;
if(x <= a[k].key) del(a[k].r, x), push_up(k);
else
{
ans += a[a[k].r].siz + a[k].val;
a[k].r = 0, k = a[k].l;
del(k, x), push_up(k);
}
}
int find_kth(int k, int x)
{
if(!k) return -1;
if(x <= a[a[k].l].siz) return find_kth(a[k].l, x);
if(x <= a[a[k].l].siz + a[k].val) return k;
return find_kth(a[k].r, x - a[a[k].l].siz - a[k].val);
}
int main()
{
int n, m, k, root = 0, lazy = 0;
char op[5];
scanf("%d%d", &n, &m);
srand(n);
while(n--)
{
scanf("%s%d", op, &k);
if(op[0] == 'I')
{
if(k < m) continue;
insert(root, k - lazy);
}
if(op[0] == 'A') lazy += k;
if(op[0] == 'S')
{
lazy -= k;
del(root, m - lazy);
}
if(op[0] == 'F')
{
k = find_kth(root, k);
printf("%d\n", ~k ? a[k].key + lazy : -1);
}
}
printf("%d\n", ans);
return 0;
}//treap模板
转载于:https://www.cnblogs.com/NLDQY/p/10079407.html