#include<algorithm>
#include<iostream>
#include<cmath>
using namespace std;
#define int long long
const int N=1e6+10;
struct node{
int l,r,ln,ans,fm;
}ask[N];
bool cmp1(node pre,node nxt){
if(pre.ln!=nxt.ln) return pre.ln<nxt.ln;
else return pre.r<nxt.r;
}
bool cmp2(node pre,node nxt){
return pre.fm<nxt.fm;
}
struct ccf{
int l,r;
}bl[N];
int vst1[N],vst2[N];
int evnt[N],trans[N];
bool tmp[N];
int n,m,cnt,len,maxn1,maxn2,rr;
struct ssb{
int pos,val;
}fft[N];
bool ccmp(ssb pre,ssb nxt){
return pre.val<nxt.val;
}
signed main(){
ios::sync_with_stdio(false);
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>evnt[i];
fft[i].val=evnt[i];
fft[i].pos=i;
}
sort(fft+1,fft+n+1,ccmp);
for(int i=1;i<=n;i++){
if(fft[i].val!=fft[i-1].val) cnt++;
trans[fft[i].pos]=cnt;
}
cnt=0;
int len=sqrt(n);
for(int i=1;i<=n;i+=len){
cnt++;
bl[cnt].l=i;
bl[cnt].r=min(i+len-1,n);
}
for(int i=1;i<=m;i++){
cin>>ask[i].l>>ask[i].r;
ask[i].fm=i;
for(int j=1;j<=cnt;j++){
if(bl[j].l<=ask[i].l&&ask[i].l<=bl[j].r){
ask[i].ln=j;
break;
}
}
}
sort(ask+1,ask+m+1,cmp1);
for(int i=1;i<=m;i++){
if(ask[i].ln!=ask[i-1].ln){
for(int j=1;j<=n;j++){
vst1[j]=vst2[j]=0;
}
rr=bl[ask[i].ln].r-1;
maxn1=maxn2=-1;
}
if(ask[i].r<bl[ask[i].ln].r){
for(int j=ask[i].l;j<=ask[i].r;j++){
vst2[trans[j]]=0;
}
for(int j=ask[i].l;j<=ask[i].r;j++){
vst2[trans[j]]++;
maxn2=max(maxn2,vst2[trans[j]]*evnt[j]);
}
ask[i].ans=maxn2;
for(int j=ask[i].l;j<=ask[i].r;j++){
vst2[trans[j]]=0;
}
continue;
}
while(rr<ask[i].r){
rr++;
vst1[trans[rr]]++;
maxn1=max(maxn1,vst1[trans[rr]]*evnt[rr]);
}
maxn2=maxn1;
for(int j=ask[i].l;j<bl[ask[i].ln].r;j++){
if(!tmp[trans[j]]){
vst2[trans[j]]=vst1[trans[j]];
tmp[trans[j]]=true;
}
vst1[trans[j]]++;
maxn1=max(maxn1,vst1[trans[j]]*evnt[j]);
}
ask[i].ans=maxn1;
maxn1=maxn2;
for(int j=ask[i].l;j<bl[ask[i].ln].r;j++){
if(tmp[trans[j]]) vst1[trans[j]]=vst2[trans[j]];
}
for(int j=ask[i].l;j<bl[ask[i].ln].r;j++){
vst2[trans[j]]=0;
tmp[trans[j]]=false;
}
}
sort(ask+1,ask+m+1,cmp2);
for(int i=1;i<=m;i++){
cout<<ask[i].ans<<'\n';
}
return 0;
}