洛谷P2617 Dynamic Ranking 树状数组套主席树

来源:互联网 发布:红酒网络推广方案 编辑:程序博客网 时间:2024/06/15 03:54
#include<stdio.h>#include<ctype.h>#include<algorithm>#define lowbit(x) (x&-x)#define N 10005using namespace std;int n,m,a[N],b[N*2],s[N][3],len;char c;int rt[N],val[N*400],lch[N*400],rch[N*400],cnt;int L[20],R[20],llen,rlen;void update(int &u,int l,int r,int k,int v) {if(!u) u=++cnt;val[u]+=v;if(l<r) {int mid=l+r>>1;if(k<=mid) update(lch[u],l,mid,k,v);else update(rch[u],mid+1,r,k,v);}}void Update(int x,int v) {int k=lower_bound(b+1,b+1+len,a[x])-b;for(; x<=n; x+=lowbit(x)) update(rt[x],1,len,k,v);}int query(int l,int r,int k) {if(l==r) return l;int mid=l+r>>1, tmp=0;for(int i=0; i<rlen; i++) tmp+=val[lch[R[i]]];for(int i=0; i<llen; i++) tmp-=val[lch[L[i]]];if(k<=tmp) {for(int i=0; i<rlen; i++) R[i]=lch[R[i]];for(int i=0; i<llen; i++) L[i]=lch[L[i]];return query(l,mid,k);} else {for(int i=0; i<rlen; i++) R[i]=rch[R[i]];for(int i=0; i<llen; i++) L[i]=rch[L[i]];return query(mid+1,r,k-tmp);}}int Query(int l,int r,int k) {llen=0, rlen=0;for(int i=r; i; i-=lowbit(i)) R[rlen++]=rt[i];for(int i=l-1; i; i-=lowbit(i)) L[llen++]=rt[i];return query(1,len,k);}int main() {scanf("%d%d",&n,&m);len=n;for(int i=1; i<=n; i++) {scanf("%d",&a[i]);b[i]=a[i];}for(int i=1; i<=m; i++) {while(isspace(c=getchar()));scanf("%d%d",&s[i][0],&s[i][1]);if(c=='Q') scanf("%d",&s[i][2]);else b[++len]=s[i][1], s[i][2]=-1;}sort(b+1,b+1+len);len=unique(b+1,b+1+len)-b-1;for(int i=1; i<=n; i++) Update(i,1);for(int i=1; i<=m; i++) {if(~s[i][2]) {printf("%d\n",b[Query(s[i][0],s[i][1],s[i][2])]);} else {Update(s[i][0],-1);a[s[i][0]]=s[i][1];Update(s[i][0],1);}}}

阅读全文
0 0
原创粉丝点击