莫队求调,悬关
查看原帖
莫队求调,悬关
325086
little_magicstar楼主2023/8/6 11:53
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
const int N = 1e5 + 10;
inline int read(){
    int k=0;
    char c;
    c=getchar();
    while(!isdigit(c))c=getchar();
    while(isdigit(c)){k=(k<<3)+(k<<1)+c-'0';c=getchar();}
    return k;
}
int n, q, a[N];
int cnt[N], kind;
bool ans[N];
struct node{
	int l, r;
	int id;
}que[N];
bool cmp(node xx, node yy){
	if(xx.l / sqrt(n) != yy.l / sqrt(n))
		return xx.l < yy.l;
	return xx.r < yy.r;
}
void add(int x, int pos){
	cnt[x] += pos;
	if(cnt[x] == 0)
		kind--;
	if(cnt[x] == 1)
		kind++;
}
int main(){
	n = read();
	q = read();
	for(int i = 1; i <= n; i++)
		a[i] = read();
	for(int i = 1; i <= q; i++){
		que[i].l = read();
		que[i].r = read();
		que[i].id = i;
	}
	sort(que + 1, que + q + 1, cmp);
	int l = 1, r = 0;
	for(int i = 1; i <= q; i++){
		while(l < que[i].l)
			add(a[l++], -1);
		while(l > que[i].l)
			add(a[--l], 1);
		while(r > que[i].r)
			add(a[r--], -1);
		while(r < que[i].r)
			add(a[++r], 1);
		if(kind == r - l + 1)		
			ans[que[i].id] = 1;
	}
	for(int i = 1; i <= q; i++){
		if(ans[i] == 1)
			puts("Yes");
		else
			puts("No");
	}
	return 0;
}
2023/8/6 11:53
加载中...