下数据来跑AC,交上去全WA
查看原帖
下数据来跑AC,交上去全WA
238861
xzzduang楼主2021/1/22 22:49
#include<iostream>
#include<stdio.h>
#include<algorithm>
#define N 100005
using namespace std;
struct segment_tree{
	int lc,rc,sum;
}d[N*40];
inline int read(){
	int x=0,f=1;
	char ch=getchar();
	while(ch<'0' || ch>'9'){if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9')x=(x<<3)+(x<<1)+(ch^48),ch=getchar();
	return x*f;
}
inline char readch(){
	char ch=getchar();
	while(ch!='Q' && ch!='C') ch=getchar();
	return ch;
}
int n,m,rt[N],pool,a[N],lsh[N*2],_n,t[N][2],cnt[2],q[N][3];
char op[N];
int lowbit(int x){return x&-x;}
void update(int &k,int l,int r,int x,int v){
	if(!k) k=++pool;
	if(l==r){
		d[k].sum=d[k].sum+v;
		return;
	}
	int mid=l+r>>1;
	if(x<=mid) update(d[k].lc,l,mid,x,v);
	else update(d[k].rc,mid+1,r,x,v);
	d[k].sum=d[d[k].lc].sum+d[d[k].rc].sum;
}
void modify(int x,int v,int val){
	for(int i=x;i<=n;i+=lowbit(i)) update(rt[i],1,_n,v,val);
}
int query(int l,int r,int v){
	if(l==r) return l;
	int res,mid=l+r>>1;
	for(int i=1;i<=cnt[1];++i) res+=d[d[t[i][1]].lc].sum;
	for(int i=1;i<=cnt[0];++i) res-=d[d[t[i][0]].lc].sum;
	if(v<=res){
		for(int i=1;i<=cnt[0];++i) t[i][0]=d[t[i][0]].lc;
		for(int i=1;i<=cnt[1];++i) t[i][1]=d[t[i][1]].lc;
		return query(l,mid,v);
	}
	else{
		for(int i=1;i<=cnt[0];++i) t[i][0]=d[t[i][0]].rc;
		for(int i=1;i<=cnt[1];++i) t[i][1]=d[t[i][1]].rc;
		return query(mid+1,r,v-res);
	}
}
int solve(int x,int y,int z){
	cnt[0]=cnt[1]=0;
	for(int i=x-1;i;i-=lowbit(i)) t[++cnt[0]][0]=rt[i];
	for(int i=y;i;i-=lowbit(i)) t[++cnt[1]][1]=rt[i];
	return query(1,_n,z);
}
int main(){
	_n=n=read(),m=read();
	for(int i=1;i<=n;++i){
		lsh[i]=a[i]=read();
	}
	for(int i=1;i<=m;++i){
		op[i]=readch();
		q[i][0]=read(),q[i][1]=read();
		if(op[i]=='Q'){
			q[i][2]=read();
		}
		else{
			lsh[++_n]=q[i][1];
		}
	}
	sort(lsh+1,lsh+_n+1);
	_n=unique(lsh+1,lsh+_n+1)-lsh-1;
	for(int i=1;i<=n;++i)
		a[i]=lower_bound(lsh+1,lsh+_n+1,a[i])-lsh;
	for(int i=1;i<=n;++i) modify(i,a[i],1);
	for(int i=1;i<=m;++i){
		if(op[i]=='C'){
			q[i][1]=lower_bound(lsh+1,lsh+_n+1,q[i][1])-lsh;
			modify(q[i][0],a[q[i][0]],-1);
			a[q[i][0]]=q[i][1];
			modify(q[i][0],a[q[i][0]],1);
		}
		else{
			printf("%d\n",lsh[solve(q[i][0],q[i][1],q[i][2])]);
		}
	}
	return 0;
}
2021/1/22 22:49
加载中...