点更新主席树
来源:互联网 发布: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
- 点更新主席树
- hdu 4348 主席树的区间更新
- 主席、树、主席树!
- bzoj 4539: [Hnoi2016]树(缩点+主席树+lca)
- HDU 4348 To the moon(主席树区间更新)
- hdu-4348-To the moon-主席树在线区间更新
- HDU 4348To the moon 主席树 + 区间更新
- 线段树 点更新
- 主席树
- 主席树
- 主席树
- 主席树
- 主席树
- 主席树
- 主席树
- 主席树
- 主席树
- 主席树
- Git学习-安装
- re:uva524素数环
- getDimension()、getDimensionPixelSize()和getDimensionPixelSize()的区别
- 主席树
- JQuery操作input
- 点更新主席树
- PDF文件压缩
- 单例模式详解
- 最小表示
- 百度搜索URL参数你知道多少
- html float 浮动
- Win7 下使用 VS2015 交叉编译最新 libcurl 7.51.0(包含openssl-1.0.2j,zlib-1.2.8)
- uva 331 Mapping the Swaps
- 树状数组