rt,已经开两倍空间了还是段错误。R170196772
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=4e5+5;
int n,m,blo,res;
int ori[N],bel[N],ans[N],bkt[N],tot[N];
struct Ques{
int l,r,id;
bool operator <(const Ques x)const{
if(bel[l]^bel[x.l])return bel[l]<bel[x.l];
return (bel[l]&1)^(r>x.r);
}
}q[N];
void add(int x){
tot[bkt[ori[x]]]--;
tot[++bkt[ori[x]]]++;
res=max(res,bkt[ori[x]]);
}
void del(int x){
tot[bkt[ori[x]]]--;
if(!tot[bkt[ori[x]]]&&bkt[ori[x]]==res)res--;
tot[--bkt[ori[x]]]++;
}
signed main(){
ios::sync_with_stdio(0);
bel[0]=1;
cin>>n>>m;
blo=n/sqrt(m);
blo=max(blo,1ll);
for(int i=1;i<=n;i++){
cin>>ori[i];
ori[i]+=2e5;
bel[i]=(i-1)/blo+1;
}
for(int i=1,l,r;i<=m;i++){
cin>>l>>r;
q[i]=(Ques){l,r,i};
}
sort(q+1,q+m+1);
for(int i=1,l=1,r=0,nl,nr;i<=m;i++){
nl=q[i].l,nr=q[i].r;
while(l>nl)add(--l);
while(r<nr)add(++r);
while(l<nl)del(l++);
while(r>nr)del(r--);
ans[q[i].id]=res;
}
for(int i=1;i<=m;i++)cout<<ans[i]<<'\n';
return 0;
}