You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

127 lines
2.9 KiB

2 years ago
#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;
}