您的位置:首页 > 其它

[Bzoj1901]Zju2112 Dynamic Rankings

2014-05-15 15:15 357 查看
/*1.change后要更新a数组
2.删除节点后子节点数量-1*/
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#define N 200010
#define M 1300010
#define inf 1000000000
using namespace std;
struct data{
int l,r,s,w,v,rnd;
}tr[M];
int root
,a[50001],n,m,sz,tmp;
void update(int k){
tr[k].s=tr[tr[k].l].s+tr[tr[k].r].s+tr[k].w;
}
void lturn(int &k){
int t=tr[k].r;
tr[k].r=tr[t].l;
tr[t].l=k;
tr[t].s=tr[k].s;
update(k);k=t;
}
void rturn(int &k){
int t=tr[k].l;
tr[k].l=tr[t].r;
tr[t].r=k;
tr[t].s=tr[k].s;
update(k);k=t;
}
void insert(int &k,int num){
if(!k){
k=++sz;
tr[k].s=tr[k].w=1;
tr[k].rnd=rand();
tr[k].l=tr[k].r=0;
tr[k].v=num;
return;
}
tr[k].s++;
if(tr[k].v==num)tr[k].w++;
else if(num<tr[k].v){
insert(tr[k].l,num);
if(tr[tr[k].l].rnd<tr[k].rnd)rturn(k);
}
else{
insert(tr[k].r,num);
if(tr[tr[k].r].rnd<tr[k].rnd)lturn(k);
}
}
void del(int &k,int num){
if(tr[k].v==num){
if(tr[k].w>1){tr[k].w--;tr[k].s--;return;}
else if(tr[k].l*tr[k].r==0)k=tr[k].l+tr[k].r;
else if(tr[tr[k].l].rnd<tr[tr[k].r].rnd){
rturn(k);del(k,num);
}
else{
lturn(k);del(k,num);
}
}
else if(num<tr[k].v){
del(tr[k].l,num);tr[k].s--;
}
else{
del(tr[k].r,num);tr[k].s--;
}
}
void change(int k,int l,int r,int x,int num,int y){
del(root[k],y);
insert(root[k],num);
if(l==r)return;
int mid=(l+r)>>1;
if(x<=mid)change(k<<1,l,mid,x,num,y);
else change(k<<1|1,mid+1,r,x,num,y);
}
void build(int k,int l,int r,int x,int num){
insert(root[k],num);
if(l==r)return;
int mid=(l+r)>>1;
if(x<=mid)build(k<<1,l,mid,x,num);
else build(k<<1|1,mid+1,r,x,num);
}
void get_rank(int k,int num){
if(!k)return;
if(num>=tr[k].v){
tmp+=tr[tr[k].l].s+tr[k].w;
get_rank(tr[k].r,num);
}
else get_rank(tr[k].l,num);
}
void ask_rank(int k,int l,int r,int x,int y,int num){
if(l==x&&r==y){get_rank(root[k],num);return;}
int mid=(l+r)>>1;
if(y<=mid)ask_rank(k<<1,l,mid,x,y,num);
else if(x>mid)ask_rank(k<<1|1,mid+1,r,x,y,num);
else{
ask_rank(k<<1,l,mid,x,mid,num);
ask_rank(k<<1|1,mid+1,r,mid+1,y,num);
}
}
void ask_index(int x,int y,int z){
int l=0,r=inf,ans;
while(l<=r)
{
int mid=(l+r)>>1;
tmp=1;ask_rank(1,1,n,x,y,mid);
if(tmp<=z){l=mid+1;ans=mid;}
else r=mid-1;
}
printf("%d\n",l);
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
for(int i=1;i<=n;i++)build(1,1,n,i,a[i]);
for(int i=1;i<=m;i++){
char s[3];int x,y,z;
scanf("%s",s);
if(s[0]=='Q'){
scanf("%d%d%d",&x,&y,&z);
ask_index(x,y,z);
}
else if(s[0]=='C'){
scanf("%d%d",&x,&y);
change(1,1,n,x,y,a[x]);
a[x]=y;
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: