#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
typedef long long ll;
const int N=200000;
int n,m,T,a[N+5],b[N+5],c[N+5],bl;
ll ans,qans[N+5];
struct Query{
int l,r,id;
}q[N+5];
bool operator <(const Query &a,const Query &b){
return a.l/bl^b.l/bl?a.l<b.l:a.r<b.r;
}
void Add(int pos){
// ll sum=1ll*(++c[a[pos]])*b[a[pos]];
// ans=(ans<sum?sum:ans);
ans=max(ans,1ll*(++c[a[pos]])*b[a[pos]]);
}
int main(){
// freopen("historical.in","r",stdin);
// freopen("historical.out","w",stdout);
ios::sync_with_stdio(0);
cin>>n>>T;
for (int i=1;i<=n;i++){
cin>>a[i];
b[i]=a[i];//离散化
}
sort(b+1,b+n+1);
m=unique(b+1,b+n+1)-b-1;//去重
for (int i=1;i<=n;i++) a[i]=lower_bound(b+1,b+m+1,a[i])-b;//a[i]记录原来a[i]在b中的下标
bl=sqrt(n);
for (int i=1;i<=T;i++){
cin>>q[i].l>>q[i].r;
q[i].id=i;
if (q[i].l/bl==q[i].r/bl){//同块内暴力处理
for (int j=q[i].l;j<=q[i].r;j++) Add(j);
qans[q[i].id]=ans,ans=0;
for (int j=q[i].r;j>=q[i].l;j--) --c[a[j]];
q[i].l=q[i].r=n+bl;//标记为已处理
}
}
sort(q+1,q+T+1);
ll backans=0;
for (int i=1,L=bl,R=bl-1,bi=0;q[i].l<=n&&i<=T;i++){
if (bi^q[i].l/bl){//进入下一个块
bi=q[i].l/bl,L=bi*bl+bl,R=L-1;
backans=ans=0;
memset(c,0,sizeof(c));
}
while (R<q[i].r) Add(++R);
backans=ans;
while (L>q[i].l) Add(--L);
qans[q[i].id]=ans;
while (L<bi*bl+bl) c[a[L++]]--;
ans=backans;
}
for (int i=1;i<=T;i++) cout<<qans[i]<<'\n';
}
22pts,思路基本同第一篇题解