不理解,感觉就是 O(nn) 的复杂度。
#include<bits/stdc++.h>
#define reg register
#define ll long long
#define MAXN 200005
#define maxn 405
using namespace std;
int n,p[MAXN],pt[MAXN],m,a,b,block;
int ip[MAXN],l[maxn],r[maxn],nus[MAXN];
int num[maxn][MAXN],maxt[maxn][maxn];
inline int read()
{
int x=0,f=1;
char c=getchar();
while(c<'0'||c>'9')
{
if(c=='-') f=-1;
c=getchar();
}
while(c>='0'&&c<='9') x=x*10+c-'0',c=getchar();
return x*f;
}
inline void write(int x)
{
if(x==0)
{
putchar('0');
return ;
}
putchar('-');
int len=0,k1=x,c[10005];
if(k1<0) k1=-k1,putchar('-');
while(k1) c[len++]=k1%10+'0',k1/=10;
while(len--) putchar(c[len]);
putchar('\n');
}
void init()
{
int block=500;
for(reg int i=1;i<=n;++i)
{
ip[i]=(i-1)/block+1;
if(ip[i]!=ip[i-1]) l[ip[i]]=i,r[ip[i]-1]=i-1;
}
r[ip[n]]=n;
for(reg int i=1;i<=ip[n];++i)
{
int maxx=0;
for(reg int j=r[i];j>=1;--j)
{
++num[i][p[j]];
if(num[i][p[j]]>num[i][maxx]) maxx=p[j];
if(ip[j]!=ip[j-1]) maxt[ip[j]][i]=maxx;
}
}
}
int ask(int L,int R)
{
if(ip[L]+1>=ip[R])
{
int maxx=0;
for(reg int i=L;i<=R;++i)
{
++nus[p[i]];
if(nus[p[i]]>nus[maxx]) maxx=p[i];
}
int ch=nus[maxx];
for(int i=L;i<=R;++i) nus[p[i]]=0;
return ch;
}
int maxx=maxt[ip[L]+1][ip[R]-1];
int alt=maxx;
nus[maxx]=num[ip[R]-1][maxx]-num[ip[L]][maxx];
for(reg int i=L;i<=r[ip[L]];++i)
{
if(nus[p[i]]==0) nus[p[i]]+=(num[ip[R]-1][p[i]]-num[ip[L]][p[i]]);
++nus[p[i]];
if(nus[p[i]]>nus[maxx]) maxx=p[i];
}
for(reg int i=l[ip[R]];i<=R;++i)
{
if(nus[p[i]]==0) nus[p[i]]+=(num[ip[R]-1][p[i]]-num[ip[L]][p[i]]);
++nus[p[i]];
if(nus[p[i]]>nus[maxx]) maxx=p[i];
}
int ch=nus[maxx];
for(reg int i=L;i<=r[ip[L]];++i) nus[p[i]]=0;
for(reg int i=l[ip[R]];i<=R;++i) nus[p[i]]=0;
nus[alt]=0;
return ch;
}
int main()
{
// ios::sync_with_stdio(0);
// cin.tie(0); cout.tie(0);
// freopen("P3709_2.in","r",stdin);
// freopen("P3709_2.out","w",stdout);
n=read(),m=read();
for(reg int i=1;i<=n;++i)
p[i]=read(),pt[i]=p[i];
sort(pt+1,pt+1+n);
int nu=unique(pt+1,pt+1+n)-pt-1;
for(reg int i=1;i<=n;++i)
p[i]=lower_bound(pt+1,pt+1+nu,p[i])-pt;
init();
for(reg int i=1;i<=m;++i)
{
a=read();b=read();
if(a>b) swap(a,b);
write(ask(a,b));
}
return 0;
}