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

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#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;
}