#include<bits/stdc++.h>
using namespace std;
const int maxn = 200000 + 10;
struct SBT {
int cnt;
int c[maxn][2], key[maxn], size[maxn];
void init() {
cnt = 0;
memset(c, 0, sizeof(c));
memset(size, 0, sizeof(size));
}
void Push_up(int u) { size[u] = size[c[u][0]] + size[c[u][1]] + 1; }
//left -> 1, right -> 0
void rotate(int &u, bool t) {
int k = c[u][t];
c[u][t] = c[k][!t];
c[k][!t] = u;
size[k] = size[u];
Push_up(u), u = k;
}
void maintain(int &u, bool t) {
if(!t) {
if(size[c[u][1]] < size[c[c[u][0]][0]])
rotate(u, 0);
else {
if(size[c[u][1]] < size[c[c[u][0]][1]]) {
rotate(c[u][0], 1);
rotate(u, 0);
}else return;
}
}else {
if(size[c[u][0]] < size[c[c[u][1]][1]])
rotate(u, 1);
else {
if(size[c[u][0]] < size[c[c[u][1]][0]]) {
rotate(c[u][1], 0);
rotate(u, 1);
}else return;
}
}
maintain(c[u][0], false);
maintain(c[u][1], true);
maintain(u, false);
maintain(u, true);
}
void insert(int &u, int v) {
if(!u) {
key[u = ++cnt] = v; size[u] = 1;
}else {
size[u]++;
if(v >= key[u])
insert(c[u][1], v);
else
insert(c[u][0], v);
maintain(u, v >= key[u]);
}
}
int del(int &u, int v) {
if(key[u] == v || ((v < key[u] && c[u][0] == 0) || (v > key[u] && c[u][1] == 0))) {
int k = key[u];
if(c[u][0] == 0 || c[u][1] == 0)
u = c[u][0] + c[u][1];
else
key[u] = del(c[u][0], k+1);
return k;
}else {
if(v > key[u])
return del(c[u][1], v);
else
return del(c[u][0], v);
}
}
int search(int u, int v) {
if(u == 0 || v == key[u])
return u;
else {
if(v > key[u])
return search(c[u][1], v);
else
return search(c[u][0], v);
}
}
int query(int u, int k) {
int s = size[c[u][0]] + 1;
if(k == s)
return key[u];
else {
if(k > s)
return query(c[u][1], k-s);
else
return query(c[u][0], k);
}
}
void out(int n) {
if(c[n][0]) out(c[n][0]);
cout << key[n] << ' ';
if(c[n][1]) out(c[n][1]);
}
}Sbt;
int main() {
#ifndef ONLINE_JUDGE
freopen("data.txt", "r", stdin);
freopen("ans.txt", "w", stdout);
#endif
int n, m, v, rt = 0;
cin >> n;
Sbt.init();
while(n--) {
cin >> m >> v;
switch(m) {
case 1: Sbt.insert(rt, v); break;
case 2: Sbt.del(rt, v); break;
case 3: Sbt.search(rt, v); break;
case 4: Sbt.query(rt, v); break;
case 5: Sbt.out(rt); break;
}
}
//Sbt.out(rt);
return 0;
}
Sbt 带查找、查询、删除操作
最新推荐文章于 2021-03-06 21:55:35 发布