127 lines
2.9 KiB
C++
127 lines
2.9 KiB
C++
#include <bits/stdc++.h>
|
||
using namespace std;
|
||
const int N = 201000;
|
||
// Splay树,没有仔细研究
|
||
// 区间第k大就必须得splay了
|
||
struct splay_tree {
|
||
int ff, cnt, ch[2], val, size;
|
||
} t[N];
|
||
int root, tot;
|
||
void update(int x) {
|
||
t[x].size = t[t[x].ch[0]].size + t[t[x].ch[1]].size + t[x].cnt;
|
||
}
|
||
void rotate(int x) {
|
||
int y = t[x].ff;
|
||
int z = t[y].ff;
|
||
int k = (t[y].ch[1] == x);
|
||
t[z].ch[(t[z].ch[1] == y)] = x;
|
||
t[x].ff = z;
|
||
t[y].ch[k] = t[x].ch[k ^ 1];
|
||
t[t[x].ch[k ^ 1]].ff = y;
|
||
t[x].ch[k ^ 1] = y;
|
||
t[y].ff = x;
|
||
update(y);
|
||
update(x);
|
||
}
|
||
void splay(int x, int s) {
|
||
while (t[x].ff != s) {
|
||
int y = t[x].ff, z = t[y].ff;
|
||
if (z != s)
|
||
(t[z].ch[0] == y) ^ (t[y].ch[0] == x) ? rotate(x) : rotate(y);
|
||
rotate(x);
|
||
}
|
||
if (s == 0)
|
||
root = x;
|
||
}
|
||
void find(int x) {
|
||
int u = root;
|
||
if (!u)
|
||
return;
|
||
while (t[u].ch[x > t[u].val] && x != t[u].val)
|
||
u = t[u].ch[x > t[u].val];
|
||
splay(u, 0);
|
||
}
|
||
void insert(int x) {
|
||
int u = root, ff = 0;
|
||
while (u && t[u].val != x) {
|
||
ff = u;
|
||
u = t[u].ch[x > t[u].val];
|
||
}
|
||
if (u)
|
||
t[u].cnt++;
|
||
else {
|
||
u = ++tot;
|
||
if (ff)
|
||
t[ff].ch[x > t[ff].val] = u;
|
||
t[u].ch[0] = t[u].ch[1] = 0;
|
||
t[tot].ff = ff;
|
||
t[tot].val = x;
|
||
t[tot].cnt = 1;
|
||
t[tot].size = 1;
|
||
}
|
||
splay(u, 0);
|
||
}
|
||
int Next(int x, int f) {
|
||
find(x);
|
||
int u = root;
|
||
if (t[u].val > x && f)
|
||
return u;
|
||
if (t[u].val < x && !f)
|
||
return u;
|
||
u = t[u].ch[f];
|
||
while (t[u].ch[f ^ 1])
|
||
u = t[u].ch[f ^ 1];
|
||
return u;
|
||
}
|
||
void Delete(int x) {
|
||
int last = Next(x, 0);
|
||
int Net = Next(x, 1);
|
||
splay(last, 0);
|
||
splay(Net, last);
|
||
int del = t[Net].ch[0];
|
||
if (t[del].cnt > 1) {
|
||
t[del].cnt--;
|
||
splay(del, 0);
|
||
} else
|
||
t[Net].ch[0] = 0;
|
||
}
|
||
int kth(int x) {
|
||
int u = root;
|
||
while (t[u].size < x)
|
||
return 0;
|
||
while (1) {
|
||
int y = t[u].ch[0];
|
||
if (x > t[y].size + t[u].cnt) {
|
||
x -= t[y].size + t[u].cnt;
|
||
u = t[u].ch[1];
|
||
} else if (t[y].size >= x)
|
||
u = y;
|
||
else
|
||
return t[u].val;
|
||
}
|
||
}
|
||
int main() {
|
||
int n;
|
||
scanf("%d", &n);
|
||
insert(1e9);
|
||
insert(-1e9);
|
||
while (n--) {
|
||
int opt, x;
|
||
scanf("%d%d", &opt, &x);
|
||
if (opt == 1)
|
||
insert(x);
|
||
if (opt == 2)
|
||
Delete(x);
|
||
if (opt == 3) {
|
||
find(x);
|
||
printf("%d\n", t[t[root].ch[0]].size);
|
||
}
|
||
if (opt == 4)
|
||
printf("%d\n", kth(x + 1));
|
||
if (opt == 5)
|
||
printf("%d\n", t[Next(x, 0)].val);
|
||
if (opt == 6)
|
||
printf("%d\n", t[Next(x, 1)].val);
|
||
}
|
||
return 0;
|
||
} |