求调!!!
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
typedef long long ll;
const ll RandMod = 19260817;
const ll INF = 1e9;
struct Treap{
ll data, value;
ll l, r;
ll size;
}T[100003];
ll cnt, root;
inline void Update(ll o){
T[o].size = T[T[o].l].size + T[T[o].r].size + 1;
return ;
}
void RightRotate(ll &now){
ll L = T[now].l;
T[now].l = T[L].r;
T[L].r = now;
T[L].size = T[now].size;
Update(now);
now = L;
return ;
}
void LeftRotate(ll &now){
ll R = T[now].r;
T[now].r = T[R].l;
T[R].l = now;
T[R].size = T[now].size;
Update(now);
now = R;
return ;
}
void insert(ll &now, ll data){
if(now == 0){
now = ++cnt;
T[now].size = 1;
T[now].data = data;
T[now].value = rand() * rand() % RandMod;
return ;
}
++T[now].size;
if(data >= T[now].data){
insert(T[now].r, data);
}else{
insert(T[now].l, data);
}
if(T[now].l != 0 && T[now].value > T[T[now].l].value){
RightRotate(now);
}
if(T[now].r != 0 && T[now].value > T[T[now].r].value){
LeftRotate(now);
}
Update(now);
return ;
}
void Del(ll &now, ll data){
T[now].size--;
if(T[now].data == data){
if(T[now].l == 0 && T[now].r == 0){
now = 0;
return ;
}
if(T[now].l == 0 || T[now].r == 0){
now = T[now].l + T[now].r;
return ;
}
if(T[T[now].l].value < T[T[now].r].value){
RightRotate(now);
Del(T[now].r, data);
return ;
}else{
LeftRotate(now);
Del(T[now].l, data);
return ;
}
}
if(T[now].data >= data){
Del(T[now].l, data);
}else{
Del(T[now].r, data);
}
Update(now);
return ;
}
ll Rank(ll now, ll data){
if(now == 0){
return 0;
}
if(data > T[now].data){
return T[T[now].l].size + 1 + Rank(T[now].r, data);
}
return Rank(T[now].l, data);
}
ll Find(ll now, ll rank){
if(rank == T[T[now].l].size + 1){
return T[now].data;
}
if(rank > T[T[now].r].size + 1){
return Find(T[now].r, rank - T[T[now].l].size - 1);
}
return Find(T[now].l, rank);
}
ll QueryPre(ll now, ll data){
if(now == 0){
return 0;
}
if(T[now].data >= data){
return QueryPre(T[now].l, data);
}
ll R = QueryPre(T[now].r, data);
if(R == 0){
return T[now].data;
}
return R;
}
ll QuerySuf(ll now, ll data){
if(now == 0){
return 0;
}
if(T[now].data <= data){
return QuerySuf(T[now].r, data);
}
ll L = QuerySuf(T[now].l, data);
if(L == 0){
return T[now].data;
}
return L;
}
int main(){
srand(19260817);
ll n;
cin >> n;
for(ll i = 1; i <= n; ++i){
ll opt, data;
cin >> opt >> data;
if(opt == 1){
insert(root, data);
}else if(opt == 2){
Del(root, data);
}else if(opt == 3){
cout << Rank(root, data) + 1 << endl;
}else if(opt == 4){
cout << Find(root, data) << endl;
}else if(opt == 5){
cout << QueryPre(root, data) << endl;
}else if(opt == 6){
cout << QuerySuf(root, data) << endl;
}
}
return 0;
}
卡死我了qwq