#include <iostream>
using namespace std;
const int maxn = 2e5 + 10, inf = 2147483647;
int n;
int RT[maxn], tot, cnt;
int rand()
{
static unsigned long long rd = 23333;
return (rd *= 2333) %= 2147483647;
}
struct node
{
int siz;
int ch[2];
int data, val;
} t[maxn * 20];
int newnode(int x)
{
t[++cnt].val = x,
t[cnt].siz = 1,
t[cnt].data = rand(),
t[cnt].ch[0] = t[cnt].ch[1] = 0;
return cnt;
}
int copynode(int x)
{
t[++cnt] = t[x];
return cnt;
}
void pushup(int rt) { t[rt].siz = t[t[rt].ch[0]].siz + t[t[rt].ch[1]].siz + 1; }
int merge(int x, int y)
{
if (!x || !y) return x + y;
if (t[x].data < t[y].data)
{
int p = copynode(x);
t[p].ch[1] = merge(t[p].ch[1], y);
pushup(p);
return p;
}
else
{
int p = copynode(y);
t[p].ch[0] = merge(x, t[p].ch[0]);
pushup(p);
return p;
}
}
void split(int rt, int& x, int& y, int val)
{
if (!rt) { x = y = 0; return; }
int nw = copynode(rt);
if (t[nw].val <= val)
{
x = nw;
split(t[x].ch[1], t[x].ch[1], y, val);
}
else
{
y = nw;
split(t[y].ch[0], x, t[y].ch[0], val);
}
pushup(nw);
}
void ins(int v, int x)
{
int a, b;
split(RT[v], a, b, x - 1);
RT[v] = merge(merge(a, newnode(x)), b);
return;
}
void del(int v, int x)
{
int a, b, c;
split(RT[v], a, b, x - 1);
split(b, b, c, x);
b = merge(t[b].ch[0], t[b].ch[1]);
RT[v] = merge(merge(a, b), c);
return;
}
int query_rank(int v, int x)
{
int a, b;
split(RT[v], a, b, x - 1);
int tmp = t[a].siz + 1;
RT[v] = merge(a, b);
return tmp;
}
int query_kth(int v, int kth)
{
int u = RT[v];
while (kth)
{
if (kth <= t[t[u].ch[0]].siz) u = t[u].ch[0];
else if (t[t[u].ch[0]].siz == kth - 1) return t[u].val;
else kth -= t[t[u].ch[0]].siz + 1, u = t[u].ch[1];
}
return t[u].val;
}
int pre(int v, int x)
{
int a, b;
split(RT[v], a, b, x - 1);
if (!a) return -inf;
int tmp = query_kth(a, t[a].siz);
RT[v] = merge(a, b);
return tmp;
}
int suf(int v, int x)
{
int a, b;
split(RT[v], a, b, x);
if (!b) return inf;
int tmp = query_kth(b, 1);
RT[v] = merge(a, b);
return tmp;
}
int main()
{
std::ios::sync_with_stdio(false); std::cin.tie(0); std::cout.tie(0);
cin >> n;
while (n--)
{
int opt, v, x;
cin >> v >> opt;
RT[++tot] = RT[v];
switch(opt)
{
case 1:
cin >> x,
ins(tot, x);
break;
case 2:
cin >> x,
del(tot, x);
break;
case 3:
cin >> x,
cout << query_rank(tot, x) << "\n";
break;
case 4:
cin >> x,
cout << query_kth(tot, x) << "\n";
break;
case 5:
cin >> x,
cout << pre(tot, x) << "\n";
break;
default:
cin >> x,
cout << suf(tot, x) << "\n";
break;
}
// for (int i = 1; i <= n; i++) cout << query_kth(tot, i) << " ";
// cout << "\n";
}
return 0;
}
已知是 pre 和 suf 的问题。不过这样查询为什么不对呢?
到底是怎么会是呢?/yiw