题面毒瘤,所以戳这→P3901 数列找不同
【解题思路】:
这真的是莫队板子题了,必做。
【AC代码】:
#include<bits/stdc++.h>
#define M(a,b) memset(a,b,sizeof(a))
#define INF 0x3f3f3f3f
#define MOD 1000000009
using namespace std;
inline void read(int &x){
char ch=getchar(),c=ch;
x=0;
while(ch<'0' || ch>'9'){
c=ch;
ch=getchar();
}
while(ch>='0' && ch<='9'){
x=(x<<1)+(x<<3)+ch-'0';
ch=getchar();
}
if(c=='-')x=-x;
}
int N,Q,i,answer,tp;
int a[100005],pos[100005],cnt[100005],ans[100005];
struct Node{
int L,R,id;
}f[100005];
bool cmp1(Node a,Node b){
return a.L/tp==b.L/tp?a.R<b.R:a.L<b.L;
}
void add(int p){
if(++cnt[a[p]]==1)answer++;
}
void remove(int p){
if(--cnt[a[p]]==0)answer--;
}
int main(){
read(N),read(Q);
tp=sqrt(N);
for(i=1;i<=N;i++)read(a[i]);
for(i=1;i<=Q;i++){
read(f[i].L),read(f[i].R);
f[i].id=i;
}
sort(f+1,f+1+Q,cmp1);
int curL=0,curR=0;
for(i=1;i<=Q;i++){
int L=f[i].L,R=f[i].R;
while(curL>L)add(--curL);
while(curR<R)add(++curR);
while(curL<L)remove(curL++);
while(curR>R)remove(curR--);
answer==R-L+1?ans[f[i].id]=1:ans[f[i].id]=0;
}
for(i=1;i<=Q;i++){
ans[i]?puts("Yes"):puts("No");
}
return 0;
}