点更新主席树

来源:互联网 发布:mac dock图标大小 编辑:程序博客网 时间:2024/06/05 22:56
///zoj 2112#include<algorithm>#include<cstdio>#include<iostream>#include<cstring>using namespace std;#define mid (l+r)/2#define w(i) T[(i)].w#define ls(i) T[(i)].ls#define rs(i) T[(i)].rsconst int N=60010;const int M=N*40;struct Tree{    int ls,rs,w;}T[M];int rt[N],tot,ht[N];int Pos,Val;void update(int &o,int l,int r){    T[++tot]=T[o];o=tot;    T[o].w+=Val;    if(l==r) return;    if(Pos<=mid)update(T[o].ls,l,mid);    else update(T[o].rs,mid+1,r);}int n,m;int lowbit(int x){return x&(-x);}void add(int pos,int x,int val){    Pos=x,Val=val;    for(;pos<=n;pos+=lowbit(pos))update(rt[pos],1,m);}int use[2][N];int sum(int x,int p){    int ret=0;    for(;x;x-=lowbit(x))ret+=T[T[use[p][x]].ls].w;    return ret;}int L,R;int lo,ro;int query(int l,int r,int k,int p){    if(l==r) return l;    int tmp=sum(R,p)-sum(L-1,p);    tmp+=T[T[ro].ls].w-T[T[lo].ls].w;    if(k<=tmp){        for(int i=L-1;i;i-=lowbit(i))use[p^1][i]=T[use[p][i]].ls;        for(int i=R;i;i-=lowbit(i))use[p^1][i]=T[use[p][i]].ls;        lo=T[lo].ls,ro=T[ro].ls;        return query(l,mid,k,p^1);    }    else{        for(int i=L-1;i;i-=lowbit(i))use[p^1][i]=T[use[p][i]].rs;        for(int i=R;i;i-=lowbit(i))use[p^1][i]=T[use[p][i]].rs;        lo=T[lo].rs,ro=T[ro].rs;        return query(mid+1,r,k-tmp,p^1);    }}struct Node{    int l,r,k;}node[10002];int a[N],b[N],q;void init(){    sort(b,b+m);    m=unique(b,b+m)-b;}int main(){    #ifdef DouBi    freopen("in.cpp","r",stdin);    #endif // DouBi    int t;scanf("%d",&t);    while(t--){        scanf("%d%d",&n,&q);        tot=m=0;        for(int i=1;i<=n;i++){            scanf("%d",&a[i]); b[m++]=a[i];        }        for(int i=1;i<=q;i++){            char op[2]; scanf("%s",op);            if(op[0]=='Q'){                scanf("%d%d%d",&node[i].l,&node[i].r,&node[i].k);            }            else{                scanf("%d%d",&node[i].l,&node[i].r);                node[i].k=0; b[m++]=node[i].r;            }        }        init();        memset(T,0,sizeof(T[0]));rt[0]=0;ht[0]=0;        for(int i=1;i<=n;i++)rt[i]=rt[0];        for(int i=1;i<=n;i++){            int pos=lower_bound(b,b+m,a[i])-b+1;ht[i]=ht[i-1];            Pos=pos,Val=1;            update(ht[i],1,m);        }        for(int i=1;i<=q;i++){            if(node[i].k){                L=node[i].l,R=node[i].r;                lo=ht[node[i].l-1],ro=ht[node[i].r];                for(int j=L-1;j;j-=lowbit(j))use[0][j]=rt[j];                for(int j=R;j;j-=lowbit(j))use[0][j]=rt[j];                printf("%d\n",b[query(1,m,node[i].k,0)-1]);            }            else{                int id=node[i].l, val=node[i].r;                int pos=lower_bound(b,b+m,a[id])-b+1;                add(id,pos,-1);                pos=lower_bound(b,b+m,val)-b+1;                add(id,pos,1);                a[id]=val;            }        }    }    return 0;}

0 0
原创粉丝点击