记录编号 100315 评测结果 AAAAAAAAAA
题目名称 动态排名系统 最终得分 100
用户昵称 GravatarSuke 是否通过 通过
代码语言 C++ 运行时间 1.312 s
提交时间 2014-05-05 11:52:07 内存使用 116.22 MiB
显示代码纯文本
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define maxn 50010
struct segment{
	int l,r,sum;
} t[maxn*200];
int cnt,tot,n,m,N,M;
int data[maxn],hash[maxn*2],root[maxn];
int L[2000],R[2000];
char opt[maxn][2];
int X[maxn],Y[maxn],Z[maxn];
inline int lowbit(int x){return x&(-x);}
void build(int &x,int l,int r){
	t[x=++tot].sum=0;
	if(l==r) return;
	int mid=(l+r)>>1;
	build(t[x].l,l,mid);
	build(t[x].r,mid+1,r);
}
void update(int last,int y,int l,int r,int &x,int flag){
	t[x=++tot].sum=t[last].sum+flag;
	t[x].l=t[last].l;t[x].r=t[last].r;
	if(l==r) return;
    int mid=(l+r)>>1;
    if(y<=mid) update(t[last].l,y,l,mid,t[x].l,flag);
    else update(t[last].r,y,mid+1,r,t[x].r,flag);
}

int ask(int l,int r,int k){
	if(l==r) return l;
	int now=0,i;
	for(i=1;i<=N;++i) now-=t[t[L[i]].l].sum;
	for(i=1;i<=M;++i) now+=t[t[R[i]].l].sum;
	int mid=(l+r)/2;
	if(k<=now){
		for(i=1;i<=N;++i) L[i]=t[L[i]].l;
		for(i=1;i<=M;++i) R[i]=t[R[i]].l;
		return ask(l,mid,k);
	}
	else{
		for(i=1;i<=N;++i) L[i]=t[L[i]].r;
		for(i=1;i<=M;++i) R[i]=t[R[i]].r;
		return ask(mid+1,r,k-now);
	}
}
int bit_ask(int l,int r,int k){
	N=0;M=0;
	for(;l;l-=lowbit(l)) L[++N]=root[l];
	for(;r;r-=lowbit(r)) R[++M]=root[r];
	return ask(1,cnt,k);
} 
void bit_update(int x,int y,int flag){
	for(;x<=n;x+=lowbit(x))
	 update(root[x],y,1,cnt,root[x],flag);
}
int main(){
	freopen("dynrank.in","r",stdin);
	freopen("dynrank.out","w",stdout);
int sk;
cin>>sk;
while(sk--){
	scanf("%d%d",&n,&m);
	cnt=0;tot=0;
	memset(root,0,sizeof(root));//!!!!
	int i;
	for(i=1;i<=n;++i) scanf("%d",data+i),hash[++cnt]=data[i];
	for(i=1;i<=m;++i){
		scanf("%s%d%d",opt[i],X+i,Y+i);
		if(opt[i][0]=='Q') scanf("%d",Z+i);
		else hash[++cnt]=Y[i];
	}
	sort(hash+1,hash+cnt+1);
	cnt=unique(hash+1,hash+cnt+1)-hash-1;
	build(root[0],1,cnt);
	for(i=1;i<=n;++i){
		data[i]=lower_bound(hash+1,hash+cnt+1,data[i])-hash;
	    bit_update(i,data[i],1);	
	}
	for(i=1;i<=m;++i){
		if(opt[i][0]=='Q')
			printf("%d\n",hash[bit_ask(X[i]-1,Y[i],Z[i])]);
        else{
        	bit_update(X[i],data[X[i]],-1);
        	data[X[i]]=lower_bound(hash+1,hash+cnt+1,Y[i])-hash;
        	bit_update(X[i],data[X[i]],1);
        }
	}
}
}