分块WA 5pts求调
查看原帖
分块WA 5pts求调
745332
Henry2012楼主2025/8/5 16:05

rt

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+7,M=320,K=450;
int a[N],b[N*2],s[M][N],sk[M][K],f[N],fk[K],n,q,k,sz,m,szk,mk;
int lb[M],rb[M],bl[N],lbk[K],rbk[K],blk[N*2],op[N],ql[N],qr[N],qk[N];
char ops[5];
void update(int x,int y){
	int z=a[x];
	for (int i=bl[x];i<=m;++i){
		--s[i][z],--sk[i][blk[z]];
		++s[i][y],++sk[i][blk[y]];
	}
	a[x]=y;
}
int query(int l,int r,int k){
	int lk=bl[l],rk=bl[r],p=0,ans=0;
	if (lk==rk){
		for (int i=l;i<=r;++i)
			++f[a[i]],++fk[blk[a[i]]];
		for (int i=0;i<=mk;++i){
			if (k<=fk[i]) {p=i;break;}
			k-=fk[i];
		}
		for (int i=lbk[p];i<=rbk[p];++i){
			if (k<=f[i]) {ans=i;break;}
			k-=f[i];
		}
		for (int i=l;i<=r;++i)
			f[a[i]]=fk[blk[a[i]]]=0;
		return ans;
	}
	for (int i=l;i<=rb[lk];++i)
		++f[a[i]],++fk[blk[a[i]]];
	for (int i=lb[rk];i<=r;++i)
		++f[a[i]],++fk[blk[a[i]]];
	for (int i=0;i<=mk;++i){
		int x=fk[i]+sk[rk-1][i]-sk[lk][i];
		if (k<=x) {p=i;break;}
		k-=x;
	}
	for (int i=lbk[p];i<=rbk[p];++i){
		int x=f[i]+s[rk-1][i]-s[lk][i];
		if (k<=x) {ans=i;break;}
		k-=x;
	}
	for (int i=l;i<=rb[lk];++i)
		f[a[i]]=fk[blk[a[i]]]=0;
	for (int i=lb[rk];i<=r;++i)
		f[a[i]]=fk[blk[a[i]]]=0;
	return ans;
}
signed main(){
	scanf("%d%d",&n,&q);
	for (int i=1;i<=n;++i)
		scanf("%d",a+i),b[++k]=a[i];
	for (int i=1;i<=q;++i){
		scanf("%s%d%d",ops,ql+i,qr+i);
		if (*ops=='C') op[i]=1,b[++k]=qr[i];
		else op[i]=2,scanf("%d",qk+i);
	}
	sort(b+1,b+k+1),k=unique(b+1,b+k+1)-b-1;
	for (int i=1;i<=n;++i)
		a[i]=lower_bound(b+1,b+k+1,a[i])-b;
	for (int i=1;i<=q;++i)
		if (op[i]==1) qr[i]=lower_bound(b+1,b+k+1,qr[i])-b;
	sz=sqrt(n),m=n/sz,szk=sqrt(k),mk=k/szk;
	for (int i=0;i<=m;++i){
		lb[i]=max(1,i*sz),rb[i]=min(n,i*sz+sz-1);
		for (int j=lb[i];j<=rb[i];++j)
			bl[j]=i;
	}
	for (int i=0;i<=mk;++i){
		lbk[i]=max(1,i*szk),rbk[i]=min(k,i*szk+szk-1);
		for (int j=lbk[i];j<=rbk[i];++j)
			blk[j]=i;
	}
	for (int i=0;i<=m;++i){
		for (int j=1;j<=k;++j)
			s[i][j]=(i ? s[i-1][j] : 0);
		for (int j=1;j<=mk;++j)
			sk[i][j]=(i ? sk[i-1][j] : 0);
		for (int j=lb[i];j<=rb[i];++j)
			++s[i][a[j]],++sk[i][blk[a[j]]];
	}
	for (int i=1;i<=q;++i){
		if (op[i]==1) update(ql[i],qr[i]);
		else printf("%d\n",b[query(ql[i],qr[i],qk[i])]);
	}
	return 0;
}
2025/8/5 16:05
加载中...