#include<bits/stdc++.h>
#define N 1000005
#define int long long
#define INF 1e18
using namespace std;
struct node{
int l,r,id;
}e[N];
struct roll{
int id,tt,ans;
}q[N];
int n,m,cnt,blc,tmp,fnt;
int a[N],b[N],tot[N],bel[N],tt[N],ans[N];
bool cmp(node x,node y){
if(bel[x.l]!=bel[y.l]) return x.l<y.l;
return x.r<y.r;
}
void add(int x,int y){
if(y) q[++fnt]={a[x],tot[a[x]],tmp};
tot[a[x]]++,tmp=max(tmp,tot[a[x]]);
}
signed main(){
ios::sync_with_stdio(false);
cin>>n>>m,blc=sqrt(n);
for(int i=1;i<=n;i++)
cin>>a[i],b[i]=a[i],bel[i]=(i-1)/blc+1;
sort(b+1,b+n+1);
cnt=unique(b+1,b+n+1)-(b+1);
for(int i=1;i<=n;i++)
a[i]=lower_bound(b+1,b+cnt+1,a[i])-b;
for(int i=1,l,r;i<=m;i++)
cin>>l>>r,e[i]={l,r,i};
sort(e+1,e+m+1,cmp);
int l,r;
for(int i=1;i<=m;i++){
l=min(bel[e[i].l]*blc,n)+1;
if(i==1||bel[e[i].l]!=bel[e[i-1].l]){
r=l-1,tmp=0;
for(int j=1;j<=cnt;j++) tot[j]=0;
}
if(bel[e[i].l]==bel[e[i].r]){
int res=0;
for(int j=e[i].l;j<=e[i].r;j++)
tt[a[j]]=0;
for(int j=e[i].l;j<=e[i].r;j++)
res=max(res,++tt[a[j]]);
ans[e[i].id]=res;
continue;
}
while(r<e[i].r) add(++r,0);
while(l>e[i].l) add(--l,1);
ans[e[i].id]=tmp;
while(fnt){
tot[q[fnt].id]=q[fnt].tt;
tmp=q[fnt].ans,fnt--;
}
}
for(int i=1;i<=m;i++) cout<<-ans[i]<<endl;
return 0;
}
其中
while(r<e[i].r) add(++r,0);
while(l>e[i].l) add(--l,1);
为什么不能换位置啊