#include <bits/stdc++.h>
using namespace std;
const int N=100010;
int n,m;
int a[N],g[N],ans[N],res,d[N];
struct code
{
int l,r,i;
bool operator<(const code&t)const// 莫对算法按照区间排序 //核心使得移动次数减少以至于达到为n根号n的时间复杂度
{
if(g[l]==g[t.l]) return g[r]==g[t.r]?(r<t.r):(g[r]<g[t.r]);
return g[l]<g[t.l];
}
}q[N];
// 表示区间修改
void add(int k)
{
d[a[k]]++;
if(d[a[k]]==2) res++;
}
void del(int k)
{
d[a[k]]--;
if(d[a[k]]==1) res--;
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
cin>>n>>m;
int block=sqrt(n);
for(int i=1;i<=n;i++)
{
cin>>a[i];
g[i]=(i-1)/block+1;
}
for(int i=1;i<=m;i++)
{
cin>>q[i].l>>q[i].r;
q[i].i=i;// 表示离线算法
}
sort(q+1,q+1+m);
int l=1,r=0;
for(int i=1;i<=m;i++)
{
auto [ll,rr,ii]=q[i];
while(ll<l) add(--l);
while(rr>r) add(++r);
while(ll>l) del(l++);
while(rr<r) del(r--);
ans[ii]=res;
}
for(int i=1;i<=m;i++) ans[i]?cout<<"No"<<endl:cout<<"Yes"<<endl;
return 0;
}
#include <bits/stdc++.h>
using namespace std;
#define endl "\n"
const int N=1000010;
int ans[N],val[N],tim[N],pos[N],g[N],a[N],cnt[N],pre[N];
int pl=1,pr=0;
int cnt1,cnt2,res,cur;
struct code
{
int l,r,id,t;
bool operator<(const code&t)
{
if(g[l]==g[t.l]) return g[r]==g[t.r]?(r<t.r):(g[r]<g[t.r]);
return g[l]<g[t.l];
}
}q[N];
int n,m;
void change_add(int cur)// 表示对时间轴的回溯
{
if(pos[cur] >= pl && pos[cur] <= pr)
{
cnt[a[pos[cur]]]--;
if(!cnt[a[pos[cur]]]) res--;
}
pre[cur] = a[pos[cur]];
a[pos[cur]] = val[cur];
if(pos[cur] >= pl && pos[cur] <= pr)
{
if(!cnt[a[pos[cur]]]) res++;
cnt[a[pos[cur]]]++;
}
}
void change_del(int cur)
{
if(pos[cur] >= pl && pos[cur] <= pr){
cnt[a[pos[cur]]]--;
if(!cnt[a[pos[cur]]]) res--;
}
a[pos[cur]] = pre[cur];
if(pos[cur] >= pl && pos[cur] <= pr){
if(!cnt[a[pos[cur]]]) res++;
cnt[a[pos[cur]]]++;
}
}
void change(int now)
{
while(cur<cnt2&&tim[cur+1]<=now) change_add(++cur);
while(cur&&tim[cur]>now) change_del(cur--);
}
void add(int k)
{
if(!cnt[a[k]]) res++;
cnt[a[k]]++;
}
void del(int k)
{
cnt[a[k]]--;
if(!cnt[a[k]]) res--;
}
int main ()
{
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
cin>>n>>m;
int block=pow(n,0.666);
for(int i=1;i<=n;i++) cin>>a[i],g[i]=(i-1)/block+1;
char op[2];
int l,r;
for(int i=1;i<=m;i++)
{
cin>>op>>l>>r;
if(*op=='Q') q[++cnt1]={l,r,cnt1,i};// 区间 次数 时间
else tim[++cnt2]=i,pos[cnt2]=l,val[cnt2]=r;// 表示记录时间和操作
}
sort(q+1,q+1+cnt1);// 表示分块排序
for(int i=1;i<=cnt1;i++)
{
auto [l,r,id,t]=q[i];// 区间 位置 时间
change(t);// 对目前的时间开始判断
while(pr<r) add(++pr);
while(pl>l) add(--pl);
while(pr>r) del(pr--);
while(pl<l) del(pl++);
ans[id]=res;
}
for(int i=1;i<=cnt1;i++) cout<<ans[i]<<endl;
return 0;
}
秋衣神!