RT,代码查了2天没查出来错误 求检查
#include <iostream>
#include <cstdio>
using namespace std ;
const int N = 1e5 + 5 ;
const double ept = 0.75 ;
struct node {
int l , r , val ;
int size , fact ;
bool exist ;
}tzy[N];
int n , root , cnt ;
void add_newnode(int &now , int val) {
now=++cnt ;
tzy[now].val = val ;
tzy[now].size=tzy[now].fact = 1 ;
tzy[now].exist=true ;
}
bool imbanlence(int now)
{
if(max(tzy[tzy[now].l].size,tzy[tzy[now].r].size)>tzy[now].size*ept
||tzy[now].size-tzy[now].fact>tzy[now].size*0.3)
return true ;
return false ;
}
#include <vector>
vector <int> v;
void inBL(int now) {
if(!now) return ;
inBL(tzy[now].l);
if(tzy[now].exist)
v.push_back(now) ;
inBL(tzy[now].r) ;
}
void lift ( int l , int r , int &now ) {
if(l==r) {
now = v[l] ;
tzy[now].l=tzy[now].r=0;
tzy[now].size=tzy[now].fact=1;
return ;
}
int m = (l+r)>>1;
while(l<m&&tzy[v[m]].val==tzy[v[m-1]].val) {
m--;
}
now = v[m] ;
if(l<m)
lift(l,m-1,tzy[now].l);
else tzy[now].l = 0;
lift(m+1,r,tzy[now].r) ;
tzy[now].size=tzy[tzy[now].l].size+tzy[tzy[now].r].size+1;
tzy[now].fact=tzy[tzy[now].l].fact+tzy[tzy[now].r].fact+1;
}
void rebuild(int &now)
{
v.clear() ;
inBL(now) ;
if(v.empty())
{
now = 0 ;
return ;
}
lift(0,v.size()-1,now) ;
}
void update (int now,int end) {
if(!now) return ;
if(tzy[end].val<tzy[now].val)
update(tzy[now].l,end) ;
else update(tzy[now].r,end) ;
tzy[now].size=tzy[tzy[now].l].size+tzy[tzy[now].r].size+1;
}
void check ( int &now , int end ) {
if(now==end) return ;
if(imbanlence(now))
{
rebuild(now) ;
update(root,now) ;
return ;
}
if(tzy[end].val<tzy[now].val)
check(tzy[now].l,end) ;
else check(tzy[now].r,end) ;
}
void insert ( int &now , int x ) {
if(!now) {
add_newnode(now,x) ;
check(root,now) ;
return ;
}
tzy[now].size++;
tzy[now].fact++;
if(x<tzy[now].val)
insert(tzy[now].l,x) ;
else insert(tzy[now].r,x);
}
void del(int now,int x) {
if(tzy[now].val==x&&tzy[now].exist) {
tzy[now].fact--;
tzy[now].exist = false ;
check(root,now) ;
return ;
}
tzy[now].fact--;
if(x<tzy[now].val)
del(tzy[now].l,x) ;
else del(tzy[now].r,x) ;
}
int getrank(int val) {
int now = root , rank = 1 ;
while(now)
{
if(val>tzy[tzy[now].l].val)
{
rank+=tzy[tzy[now].l].fact+tzy[now].exist ;
now = tzy[now].r ;
}
else now = tzy[now].l ;
}
return rank ;
}
int getnum(int rank) {
int now = root ;
while(now) {
if(tzy[tzy[now].l].fact+tzy[now].exist==rank&&tzy[now].exist)
break;
else if(tzy[tzy[now].l].fact>=rank) {
now = tzy[now].l ;
}
else rank-=tzy[tzy[now].l].fact+tzy[now].exist,now = tzy[now].r ;
}
return tzy[now].val;
}
int main ( ) {
cin >> n ;
while(n--) {
int opt , x ;
cin >> opt >> x ;
switch(opt) {
case 1 :
insert(root,x) ;
break;
case 2 :
del(root,x) ;
break;
case 3 :
cout << getrank(x) << endl ;
break;
case 4 :
cout << getnum(x) << endl ;
break;
case 5 :
cout << getnum(getrank(x)-1) <<endl ;
break;
case 6 :
cout << getnum(getrank(x+1)) << endl ;
break;
}
}
//system("pause") ;
}