消防栓刚学莫队,50pts TLE求调
查看原帖
消防栓刚学莫队,50pts TLE求调
250241
Zhetengtiao楼主2024/8/16 14:16
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
const int maxn=100100;
int n,m,c[maxn],l=1,bsize,r=1,cnt[maxn],res,ans[maxn];
struct Ques{
	int l,r,id,b;
}ques[maxn];
inline bool cmp(Ques a,Ques b){
	if(a.b==b.b) return a.r<b.r;
	return a.b<b.b;
}
inline int read(){
	int res=0,w=1;char c;
	while(!isdigit(c)){
		if(c=='-') w=-1;
		c=getchar();
	}
	while(isdigit(c)){
		res=res*10+(c-'0');
		c=getchar();
	}
	return res*w;
}
void add(int l){
	cnt[c[l]]++;
	if(cnt[c[l]]==2)res++;
}
void del(int l){
	cnt[c[l]]--;
	if(cnt[c[l]]==1)res--;
}
int main(){
	n=read();m=read();
	bsize=sqrt(n);
	for(int i=1;i<=n;i++) c[i]=read();
	for(int i=1;i<=m;i++){
		ques[i].l=read();
		ques[i].r=read();
		ques[i].id=i;
		ques[i].b=l/bsize;
	}
	sort(ques+1,ques+m+1,cmp);
	for(int i=1;i<=m;i++){
		while(ques[i].r>r) add(++r);
		while(ques[i].l<l) add(--l);
		while(ques[i].r<r) del(r--);
		while(ques[i].l>l) del(l++);
		ans[ques[i].id]=res;
	}
	for(int i=1;i<=m;i++){
		if(ans[i]!=0) printf("No\n");
		else printf("Yes\n");
	}
	return 0;
}
2024/8/16 14:16
加载中...