题目:

https://www.luogu.com.cn/problem/P3901

#include<bits/stdc++.h>
#include<stdio.h>
using namespace std;
const int maxn=1e5+7;
int n,m,block,belong[maxn],arr[maxn],has[maxn],ans[maxn];
inline int gcd(int a, int b)
{ int r; while (b > 0) { r = a % b; a = b; b = r; }return a; }
struct Q
{
    int l,r,id;
    bool operator <(const Q &b)
    {
        if(belong[l]!=belong[b.l])
            return l<b.l;
        else
            return r<b.r;
    }
}query[maxn];
int L,R;
int ret=0;
int fa=0;
int s=0;

inline void add(int x)
{

    ++has[x];
     if(has[x]>1)
        ret=1;
    if(has[x]==2)
        s++;
}
inline void del(int x)
{
    --has[x];
    if(has[x]==1&&s==1)
        ret=0,s--;
    else if(has[x]==1)
        s--;
}
//从[L,R]转移到[l,r]
/*
void GetNew(int l,int r,int L,int R)
{
    while(R<r) add(arr[++R]);
    while(L>l) add(arr[--L]);
    while(R>r) del(arr[R--]);
    while(L<l) del(arr[L++]);
}
*/
int main()
{
    scanf("%d%d",&n,&m);
     block=sqrt(n);

  for(int i=1;i<=n;++i)
  {  scanf("%d",&arr[i]);
       belong[i]=(i-1)/block+1;
  }
  int cnt=0;
 int ans[maxn];
  for(int i=1;i<=m;++i)
  {
    int l,r;
    scanf("%d%d",&l,&r);

    query[i]={l,r,i};
  }
  sort(query+1,query+m+1);
 // L=1;
  for(int i=1;i<=m;++i)
  {  int l=query[i].l;
     int r=query[i].r;
     int id=query[i].id;
      //auto[l,r,id]=query[i];
      while(R<r) add(arr[++R]);
      while(L>l) add(arr[--L]);
      while(R>r) del(arr[R--]);
      while(L<l) del(arr[L++]);
      //printf("ret=%d\n",ret);
      ans[id]=ret;
  }
  for(int i=1;i<=m;++i)
  {  if(!ans[i])
           printf("Yes\n");
        else
            printf("No\n");
  }
}