#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define deb(x) cerr<<"Line: "<<__LINE__<<", val= "<<x<<"; \n"
const ll N=1e5+10,BL=1e3+10;
ll q,n,B,t[N],A[N],a[N],fa[N],ans[N];
ll res,L[BL],R[BL],nr;
void addr(){
++nr;
res=max(res,A[a[nr]]*(++t[a[nr]]));
}
struct querys{
ll l,r,bh;
bool operator<(const querys &a1) const{
if(fa[l]==fa[a1.l]) return r<a1.r;
return l<a1.l;
}
}c[N];
signed main(){
scanf("%lld %lld",&n,&q);
for(int i=1;i<=n;i++){
scanf("%lld",&A[i]);
a[i]=A[i];
}
sort(A+1,A+n+1);
for(int i=1;i<=n;i++){
a[i]=lower_bound(A+1,A+n+1,a[i])-A;
}
B=sqrt(n);
L[1]=1;
for(int i=1;i<=n;i++) fa[i]=(i-1)/B+1,R[fa[i]]=i,L[fa[i]+1]=i+1;
for(int i=1;i<=q;i++){
scanf("%lld %lld",&c[i].l,&c[i].r);
c[i].bh=i;
}
sort(c+1,c+q+1);
ll flag,tmp;
for(int i=1;i<=q;i++){
ll l=c[i].l,r=c[i].r;
if(fa[l]!=fa[c[i-1].l]){
memset(t,0,sizeof(t));
res=0;flag=1;
}
if(fa[l]==fa[r]){
res=0;
for(int i=l;i<=r;i++){
res=max(res,A[a[i]]*(++t[a[i]]));
}
for(int i=l;i<=r;i++){
t[a[i]]--;
}
ans[c[i].bh]=res;
continue;
}
if(flag==1){
flag=0;
nr=R[fa[l]];
}
while(nr<r) addr();
tmp=res;
for(int i=R[fa[l]];i>=l;i--){
res=max(res,A[a[i]]*(++t[a[i]]));
}
ans[c[i].bh]=res;
for(int i=R[fa[l]];i>=l;i--){
t[a[i]]--;
}
res=tmp;
}
for(int i=1;i<=q;i++){
printf("%lld\n",ans[i]);
}
return 0;
}
悬赏 −1 RMB 求调试。