20 pts求助
#include <bits/stdc++.h>
#define AC return 0;
#define LOCAL
#define int long long
using namespace std;
const int maxn = 3e5 + 10;
int n, m, q, k;
int ans = 0, T;
void read(int &x)
{
int f = 0;
x = 0;
char ch = getchar();
while (!isdigit(ch))
{
if (ch == '-')
f = 1;
ch = getchar();
}
while (isdigit(ch))
{
x = x * 10 + ch - '0';
ch = getchar();
}
f ? x = -x : 0;
}
void read(int &x, int &y)
{
read(x);
read(y);
}
struct treap
{
struct fhq
{
int ls, rs;
int siz, pri, st, ed, Max;
fhq() {}
fhq(int val) : siz(val), pri(rand()), ed(val), Max(val),ls(0),rs(0),st(1) {}
} t[maxn];
int cnt, root;
void push_up(int p)
{
t[p].siz = t[t[p].ls].siz + t[t[p].rs].siz + t[p].ed - t[p].st + 1;
t[p].Max = max(t[p].ed, max(t[t[p].ls].Max, t[t[p].rs].Max));
}
int merge(int L, int R)
{
if (!L || !R)
return L + R;
if (t[L].pri > t[R].pri)
{
t[L].rs = merge(t[L].rs, R);
push_up(L);
return L;
}
else
{
t[R].ls = merge(L, t[R].ls);
push_up(R);
return R;
}
}
void instert(int x)
{
t[++cnt] = fhq(x);
root = merge(root, cnt);
}
void pop(int u, int &x)
{
if (!t[u].ls)
{
if (x < t[u].siz)
{
t[u].st += x;
t[u].siz -= x;
x = -1;
}
else
{
x -= t[u].siz;
t[u].siz = 0;
t[u].st=t[u].ed=0;
}
}
else
{
pop(t[u].ls, x);
if (~x)
{
t[u].ls = t[t[u].ls].rs;
if (x < t[u].siz)
{
t[u].st += x;
t[u].siz -= x;
x = -1;
}
else
{
x -= t[u].siz;
t[u].siz = 0;
t[u].st = t[u].ed = 0;
}
}
}
push_up(u);
}
void pop(int x)
{
pop(root, x);
if (!t[root].siz)
root = t[root].rs;
}
int find(int u,int x)
{
if (x > t[t[u].ls].siz && x <= (t[t[u].ls].siz - t[u].st + t[u].ed + 1))
{
x -= t[t[u].ls].siz + 1;
x += t[u].st;
return x;
}
else if (x > (t[t[u].ls].siz - t[u].st + t[u].ed + 1))
return find(t[u].rs, x - (t[t[u].ls].siz - t[u].st + t[u].ed + 1));
return find(t[u].ls,x);
}
int find(int x)
{
return find(root,x);
}
int findmax()
{
return t[root].Max;
}
} t;
void solve()
{
int opt, x;
while (T--)
{
read(opt);
switch (opt)
{
case 1:
read(x);
t.instert(x);
break;
case 2:
read(x);
t.pop(x);
break;
case 3:
read(x);
printf("%lld\n",t.find(x));
break;
case 4:
printf("%lld\n",t.findmax());
break;
}
}
}
void init()
{
read(n, T);
}
signed main()
{
#ifdef LOCAL
freopen("in.in", "r", stdin);
freopen("out.out", "w", stdout);
#endif
init();
solve();
AC
}