标签:
bzoj3224:普通平衡树,照着模板打$_$。。。
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define rep(i,n) for(int i=1;i<=n;i++)
#define clr(x,c) memset(x,c,sizeof(x))
int read(){
int x=0;char c=getchar();bool f=true;
while(!isdigit(c)){ if(c==‘-‘) f=false;c=getchar(); }
while(isdigit(c)) x=x*10+c-‘0‘,c=getchar();
return f?x:-x;
}
struct data{
int l,r,v,size,rnd,w;
}t[100005];
int size,root,ans,n;
void update(int x){
t[x].size=t[t[x].l].size+t[t[x].r].size+t[x].w;
}
void lturn(int &x){
int tmp=t[x].r;t[x].r=t[tmp].l;t[tmp].l=x;
t[tmp].size=t[x].size;update(x);x=tmp;
}
void rturn(int &x){
int tmp=t[x].l;t[x].l=t[tmp].r;t[tmp].r=x;
t[tmp].size=t[x].size;update(x);x=tmp;
}
void insert(int &k,int x){
if(k==0){
size++;k=size;
t[k].size=t[k].w=1;t[k].v=x;t[k].rnd=rand();return ;
}
t[k].size++;
if(t[k].v==x) t[k].w++;
else if(t[k].v<x){
insert(t[k].r,x);if(t[t[k].r].rnd<t[k].rnd) lturn(k);
}else{
insert(t[k].l,x);if(t[t[k].l].rnd<t[k].rnd) rturn(k);
}
}
void del(int &k,int x){
if(k==0) return ;
if(t[k].v==x){
if(t[k].w>1) {
t[k].w--;t[k].size--;return ;
}
if(t[k].l*t[k].r==0) k=t[k].l+t[k].r;
else if(t[t[k].l].rnd<t[t[k].r].rnd) rturn(k),del(k,x);
else lturn(k),del(k,x);
}else if(x>t[k].v) t[k].size--,del(t[k].r,x);
else t[k].size--,del(t[k].l,x);
}
int queryrank(int k,int x){
if(k==0) return 0;
if(t[k].v==x) return t[t[k].l].size+1;
else if(t[k].v>x) return queryrank(t[k].l,x);
else return t[t[k].l].size+t[k].w+queryrank(t[k].r,x);
}
int querynum(int k,int x){
if(k==0) return 0;
if(x<=t[t[k].l].size) return querynum(t[k].l,x);
else if(x>t[t[k].l].size+t[k].w) return querynum(t[k].r,x-t[t[k].l].size-t[k].w);
else return t[k].v;
}
void querypro(int k,int x){
if(k==0) return ;
if(t[k].v<x) ans=k,querypro(t[k].r,x);
else querypro(t[k].l,x);
}
void querysub(int k,int x){
if(k==0) return ;
if(t[k].v>x) ans=k,querysub(t[k].l,x);
else querysub(t[k].r,x);
}
int main(){
int n=read();
rep(i,n){
int p=read(),x=read();
if(p==1) insert(root,x);
else if(p==2) del(root,x);
else if(p==3) printf("%d\n",queryrank(root,x));
else if(p==4) printf("%d\n",querynum(root,x));
else if(p==5) ans=0,querypro(root,x),printf("%d\n",t[ans].v);
else ans=0,querysub(root,x),printf("%d\n",t[ans].v);
}
return 0;
}
标签:
原文地址:http://www.cnblogs.com/fighting-to-the-end/p/5639987.html