不知道是不是查询区间l=r的情况,但加上特判的话还是一样(一开始想会不会和ans 初值有关系,但好像不论ans=1或是都是一样的第5002行错了)
#include<bits/stdc++.h>
using namespace std;
int n,q,sq,l=1,r=0,ans=1;
struct node
{
int ll,rr,ti;//ti 记录当前区间的ans
}ask[200200];
int a[100100],b[100100],vis[200100],cnt[200100];//cnt数组记录出现次数为 i的数的个数
inline int IN()
{
int x,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-') f=-1,ch=getchar();}
while('0'<=ch&&ch<='9'){ x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
return x*f;
}
inline void write(int x)
{
if(x<0){
putchar('-');
x=-x;
}
if(x>9)
write(x/10);
putchar(x%10+'0');
}
inline bool cmp(node a,node b)
{
// if(a.ll/sq==b.ll/sq)
if(a.ll==b.ll) return a.rr<b.rr;
else return a.ll<b.ll;
}
inline void l_delete(int &l,int lll)
{
while(l<lll)//左删
{
cnt[vis[a[l]]]--;//减少原有数量
if(cnt[ans]==0) ans--;
vis[a[l]]--;//数的出现次数减一
cnt[vis[a[l]]]++;//出现新的次数+1
l++;//指针移动
}
}
inline void l_add(int &l,int lll)
{
while(l>lll)//左加
{
l--;//指针移动
if(vis[a[l]]==ans) ans++;
cnt[vis[a[l]]]--;
vis[a[l]]++;
cnt[vis[a[l]]]++;
}
}
inline void r_delete(int &r,int rrr)
{
while(r>rrr)//右减
{
cnt[vis[a[r]]]--;
if(cnt[ans]==0) ans--;
vis[a[r]]--;
cnt[vis[a[r]]]++;
r--;
}
}
inline void r_add(int &r,int rrr)
{
while(r<rrr)//右加
{
r++;
if(vis[a[r]]==ans) ans++;
cnt[vis[a[r]]]--;
vis[a[r]]++;
cnt[vis[a[r]]]++;
}
}
int main()
{
ios::sync_with_stdio(0);
cin>>n>>q;
//n=IN(),q=IN(),sq=sqrt(n);
for(int i=1;i<=n;i++)
cin>>a[i],b[i]=a[i];
// b[i]=a[i]=IN();
//进行离散化
sort(b+1,b+1+n);
int k=unique(b+1,b+1+n)-b-1;
for(int i=1;i<=n;i++)
a[i]=lower_bound(b+1,b+k+1,a[i])-b;
for(int i=1;i<=q;i++)
cin>>ask[i].ll>>ask[i].rr;
//ask[i].ll=IN(),ask[i].rr=IN();
sort(ask+1,ask+1+q,cmp);
for(int i=1;i<=q;i++)
{
int lll=ask[i].ll;
int rrr=ask[i].rr;
l_delete(l,lll);
l_add(l,lll);
r_add(r,rrr);
r_delete(r,rrr);
ask[i].ti=ans;
}
for(int i=1;i<=q;i++)
cout<<ask[i].ti<<'\n';
}