P3901 数列找不同

莫队

#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstdio>
using namespace std;
const int N=100006;

int n,m,l,r,nu,q;
int ar[N],num[N],ans[N];
struct node{
	int x,y,z;
}a[N];

int get(){
	char zy=getchar();
	int z=1,y=0;
	while(zy>'9'||zy<'0'){
		if(zy=='-')z=-1;
		zy=getchar();
	}
	while(zy>='0'&&zy<='9'){
		y=y*10+zy-'0';
		zy=getchar();
	}
	return z*y;
}

bool cmp(node a,node b){
	return (a.x/q)==(b.x/q)?a.y<b.y:(a.x/q)<(b.x/q);
}

void add(int p){
	num[ar[p]]++;
	if(num[ar[p]]==2)nu++;
}

void del(int p){
	num[ar[p]]--;
	if(num[ar[p]]==1)nu--;
}

int main(){
	n=get();m=get();
	q=sqrt(n);
	for(int i=1;i<=n;i++){
		ar[i]=get();
	}
	for(int i=1;i<=m;i++){
		a[i].x=get();
		a[i].y=get();
		a[i].z=i;
	}
	sort(a+1,a+1+m,cmp);
	for(int i=1;i<=m;i++){
		while(r<a[i].y)add(++r);
		while(l>a[i].x)add(--l);
		while(r>a[i].y)del(r--);
		while(l<a[i].x)del(l++);
		if(!nu) ans[a[i].z]=1;
	}
	for(int i=1;i<=m;i++){
		if(ans[i]) printf("Yes\n");
		else printf("No\n");
	}
	return 0;
}

  

posted @ 2019-07-24 12:22  喵呜,颜儿ღ  阅读(118)  评论(0)    收藏  举报