题目描述
现有数列 A1,A2,…,AN,Q个询问 (Li,Ri),ALi,ALi+1,…,ARi 是否互不相同。
输入格式
第一行,两个整数N,Q。
第二行,NN 个整数A1,A2,…,AN。
接下来 Q 行,每行两个整数 Li,Ri。输出格式
对每个询问输出一行,
Yes
或No
。输入输出样例
输入 #1
4 2 1 2 3 2 1 3 2 4输出 #1
Yes No说明/提示
对于 50% 的数据,N,Q≤103。
对于 100% 的数据,1≤N,Q≤10^5,1≤Ai≤N,1≤Li≤Ri≤N。
#include<bits/stdc++.h>
using namespace std;
#define int long long
typedef double db;
const int N=1e5+10;
int n,q1,ans;
int a[N],Ans[N],vis[N];
struct Q
{
int l,r,id,pos;
} q[N];
int cmp(Q a,Q b)
{
return a.pos==b.pos ? a.r<b.r : a.pos<b.pos;
}
void add(int x)
{
if(vis[a[x]]==1) ans++;
vis[a[x]]++;
}
void removes(int x)
{
vis[a[x]]--;
if(vis[a[x]]==1) ans--;
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>n>>q1;
for(int i=1; i<=n; i++)
{
cin>>a[i];
}
int siz=(int)sqrt(n);
for(int i=1; i<=q1; i++)
{
cin>>q[i].l>>q[i].r;
q[i].id=i;
q[i].pos=(q[i].l-1)/siz+1;
}
sort(q+1,q+1+q1,cmp);
int l=1,r=0;
for(int i=1; i<=q1; i++)
{
while(l>q[i].l)add(--l);
while(r<q[i].r)add(++r);
while(l<q[i].l)removes(l++);
while(r>q[i].r)removes(r--);
Ans[q[i].id]=ans;
}
for(int i=1; i<=q1; i++)
{
if(Ans[i])cout<<"No"<<"\n";
else cout<<"Yes"<<"\n";
}
return 0;
}