#include<bits/stdc++.h>
#define int long long
using namespace std;
int a[100005];
int b[100005];
map<int,int>mp;
int n,q;
int ccnt=0;
vector<int>use;
struct node{
int id,l,r,ans;
}ask[100005];
int real_[100005];
int bl[100005];
void lsh(){
sort(b+1,b+n+1);
for(int i=1;i<=n;i++){
if(!mp[b[i]]){
mp[b[i]]=++ccnt;
real_[ccnt]=b[i];
}
}
for(int i=1;i<=n;i++){
bl[i]=(i+(int)sqrt(n)-1)/(int)sqrt(n);
a[i]=mp[a[i]];
}
}
bool cmp(node a,node b){
if(bl[a.l]==bl[b.l])return a.r<b.r;
return a.l<b.l;
}
int ans,tans;
int bcnt[100005];
int tcnt[100005];
int cnt[100005];
void add(int t,int f){
cnt[a[t]]++;
ans=max(ans,real_[a[t]]*cnt[a[t]]);
// cout<<t<<" "<<cnt[a[t]]<<" "<<real_[a[t]]<<"ASD"<<ans<<"\n";
if(f){
tcnt[a[t]]++;
tans=max(tans,real_[a[t]]*tcnt[a[t]]);
}
}
bool ccmp(node a,node b){
return a.id<b.id;
}
signed main(){
cin>>n>>q;
for(int i=1;i<=n;i++){
cin>>a[i];
b[i]=a[i];
}
lsh();
for(int i=1;i<=q;i++){
cin>>ask[i].l>>ask[i].r;
ask[i].id=i;
}
sort(ask+1,ask+q+1,cmp);
int l=1,r=0,nowbl=0,tl=0;
for(int i=1;i<=q;i++){
if(bl[ask[i].l]==bl[ask[i].r]){
for(int j=ask[i].l;j<=ask[i].r;j++){
bcnt[a[j]]=0;
}
int ans=0;
for(int j=ask[i].l;j<=ask[i].r;j++){
bcnt[a[j]]++;
ans=max(ans,real_[a[j]]*bcnt[a[j]]);
}
ask[i].ans=ans;
continue;
}
if(nowbl!=bl[ask[i].l]){
tans=ans=0;
for(int j=max(tl-(int)sqrt(n),1ll);j<=r;j++){
tcnt[a[j]]=cnt[a[j]]=0;
}
nowbl=bl[ask[i].l];
tl=bl[ask[i].l]*sqrt(n),r=tl-1;
while(r<ask[i].r){
add(++r,1);
}
}
l=tl;
ans=tans;
while(l>ask[i].l){
add(--l,0);
use.push_back(a[l]);
}
while(r<ask[i].r){
add(++r,1);
}
ask[i].ans=ans;
for(int i=0;i<use.size();i++){
cnt[use[i]]--;
}
use.clear();
}
sort(ask+1,ask+q+1,ccmp);
for(int i=1;i<=q;i++){
cout<<ask[i].ans<<endl;
}
return 0;
}