蜜汁RE on 2求助
查看原帖
蜜汁RE on 2求助
160839
Prean楼主2021/4/21 16:19

RT,讨论区都看过一遍了还没找到原因。。。

code:

#include<algorithm>
#include<cstdio>
#include<cmath>
const int M=1e5+5;
int n,m,p,len,cnt1,cnt2,a[M],lsh[M],ans[M];
int CB[M],num[M];
int L=1,R=0,t=0;
struct Query{
	int L,R,t,p1,p2,id;
	inline bool operator<(const Query&it)const{
		return p1==it.p1?p2==it.p2?t<it.t:R<it.R:L<it.L;
	}
}q[M];
struct Mdf{
	int id,val;
}mdf[M];
inline void swap(int&x,int&y){
	x^=y^=x^=y;
}
inline void Add(const int&val){
	--CB[num[val]];++CB[++num[val]];
}
inline void Del(const int&val){
	--CB[num[val]];++CB[--num[val]];
}
inline void Modify(const int&id){
	if(L<=mdf[id].id&&mdf[id].id<=R){
		Del(a[mdf[id].id]);Add(mdf[id].val);
	}
	swap(a[mdf[id].id],mdf[id].val);
}
inline int Q(){
	int ans=1;
	while(CB[ans++]);
	return --ans;
}
signed main(){
	register int i,f;
	scanf("%d%d",&n,&m);
	for(i=1;i<=n;++i)scanf("%d",a+i),lsh[++len]=a[i];
	std::sort(lsh+1,lsh+len+1);len=std::unique(lsh+1,lsh+len+1)-lsh-1;
	for(i=1;i<=n;++i)a[i]=std::lower_bound(lsh+1,lsh+len+1,a[i])-lsh;
	for(i=1;i<=m;++i){
		scanf("%d",&f);
		if(f==1){
			++cnt1;
			scanf("%d%d",&q[cnt1].L,&q[cnt1].R);q[cnt1].t=cnt2;q[cnt1].id=cnt1;
		}
		else{
			++cnt2;
			scanf("%d%d",&mdf[cnt2].id,&mdf[cnt2].val);
		}
	}
	p=ceil(n/sqrt(2.0*cnt1/3));
	for(i=1;i<=cnt1;++i)q[i].p1=q[i].L/p,q[i].p2=q[i].R/p;
	std::sort(q+1,q+cnt1+1);
	for(i=1;i<=cnt1;++i){
		const int&QL=q[i].L,&QR=q[i].R,&QT=q[i].t;
		while(R<QR)Add(a[++R]);
		while(L>QL)Add(a[--L]);
		while(L<QL)Del(a[L++]);
		while(R>QR)Del(a[R--]);
		while(t<QT)Modify(++t);
		while(t>QT)Modify(t--);
		ans[q[i].id]=Q();
	}
	for(i=1;i<=cnt1;++i)printf("%d\n",ans[i]);
}
2021/4/21 16:19
加载中...