AVL树求调,本人比较菜,刚学谢谢(是AVL树
#include<bits/stdc++.h>
using namespace std;
#define ls(r) tr[r].rl[0]
#define rs(r) tr[r].rl[1]
struct avl
{
long long rl[2],sz,val,he,cnt;
}tr[500010];
long long jds,n,opt,x,i,rt;
//旋转~
void pushup(long long r)
{
if(!r) return ;
tr[r].he=max(tr[ls(r)].he,tr[rs(r)].he)+1;
tr[r].sz=tr[ls(r)].sz+tr[rs(r)].sz+1;
}
void rote(long long &r,long long opt)
{
long long t=tr[r].rl[!opt];
tr[r].rl[!opt]=tr[t].rl[opt];
tr[t].rl[opt]=r;
pushup(r),pushup(t);
r=t;
}
void rote2(long long &r,long long opt)
{
rote(tr[r].rl[opt],opt);
rote(r,!opt);
}
//论如何平衡呢
void wh(long long &r)
{
long long lf=ls(r),rg=rs(r);
if(tr[lf].he==tr[rg].he+2)
{
if(tr[ls(lf)].he==tr[rg].he+1) rote(r,1);//单旋一次~
else if(tr[rs(lf)].he==tr[rg].he+1) rote2(r,0);
}
else if(tr[rg].he==tr[lf].he+2)
{
if(tr[rs(rg)].he==tr[lf].he+1) rote(r,0);
else if(tr[ls(rg)].he==tr[lf].he+1) rote2(r,1);
}
pushup(r);
}
void cz1(long long &r,long long x)
{
if(!r)
{
tr[++jds].val=x,r=jds;
pushup(r);
return ;
}
if(x<tr[r].val) cz1(ls(r),x);
else cz1(rs(r),x);
wh(r);
}
long long cz2(long long &r,long long x)
{
long long tmp;
if(tr[r].val==x || x<tr[r].val && !ls(r) || x>tr[r].val && !rs(r))
{
tmp=tr[r].val;
if(!ls(r) || !rs(r))
{
r=ls(r)+rs(r);
return tmp;
}
tr[r].val=cz2(ls(r),x);
}
else
{
if(x<tr[r].val) tmp=cz2(ls(r),x);
else tmp=cz2(rs(r),x);
}
wh(r);
return tmp;
}
long long cz3(long long r,long long x)
{
if(!r) return 1;
if(x<=tr[r].val) return cz3(ls(r),x);
return tr[ls(r)].sz+1+cz3(rs(r),x);
}
long long cz4(long long r,long long x)
{
if(tr[ls(r)].sz>=x) return cz4(ls(r),x);
if(tr[ls(r)].sz+1>=x) return tr[r].val;
return cz4(rs(r),x-tr[ls(r)].sz-1);
}
long long cz5(long long r,long long x)
{
if(!r) return -1e9;
if(tr[r].val>=x) return cz5(ls(r),x);
return max(tr[r].val,cz5(rs(r),x));
}
long long cz6(long long r,long long x)
{
if(!r) return 1e9;
if(tr[r].val<=x) return cz6(rs(r),x);
return min(tr[r].val,cz6(ls(r),x));
}
int main()
{
cin>>n;
for(i=1;i<=n;i++)
{
cin>>opt>>x;
if(opt==1) cz1(rt,x);
if(opt==2) cz2(rt,x);
if(opt==3) cout<<cz3(rt,x);
if(opt==4) cout<<cz4(rt,x);
if(opt==5) cout<<cz5(rt,x);
if(opt==6) cout<<cz6(rt,x);
}
return 0;
}