#include <bits/stdc++.h>
#define int long long
using namespace std;
inline int read()
{
int x=0,k=1;
char ch=getchar();
while (ch>'9'||ch<'0'){if(ch=='-')k=-1;ch=getchar();}
while (ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
return x*k;
}
int disperse[100005],a[100005],len,blo[100005],buck[100005],ans[100005],buck1[100005];
struct node
{
int l,r,index;
}e[100005];
inline bool cmp(node s,node s1){if(blo[s.l]==blo[s1.l]) return s.r<s1.r;return s.l<s1.l;}
inline int calc(int l,int r)
{
int res=0;
for(int i=l;i<=r;++i)++buck1[a[i]];
for(int i=l;i<=r;++i)res=max(res,(int)buck1[a[i]]*disperse[a[i]]);
for(int i=l;i<=r;++i)--buck1[a[i]];
return res;
}
signed main()
{
int n=read(),q=read();
len=sqrt(n);
for (int i=1;i<=n;++i){disperse[i]=a[i]=read();blo[i]=(i-1)/len+1;}
sort(disperse+1,disperse+n+1);
int tot=unique(disperse+1,disperse+n+1)-disperse-1;
for(int i=1;i<=n;++i)a[i]=lower_bound(disperse+1,disperse+tot+1,a[i])-disperse;
for(int i=1;i<=q;++i){e[i].index=i;e[i].l=read();e[i].r=read();}
sort(e+1,e+q+1,cmp);
int bn=blo[n];
for(int i=1,j=1;i<=bn;++i)
{
int blor=min(n,i*len);
int l=blor+1,r=blor,temp=0;
memset(buck,0,sizeof(buck));
while (blo[e[j].l]==i)
{
if(blo[e[j].r]==i)
{
ans[e[j].index]=calc(e[j].l,e[j].r);
++j;
continue;
}
while (r<e[j].r)
{
++r;
++buck[a[r]];
temp=max(temp,(int)buck[a[r]]*disperse[a[r]]);
}
int tt=temp;
while (e[j].l<l)
{
--l;
++buck[a[l]];
temp=max(temp,(int)buck[a[l]]*disperse[a[l]]);
}
ans[e[j].index]=temp;
while(l<=blor)
{
--buck[a[l]];
++l;
}
temp=tt;
++j;
}
}
for(int i=1;i<=q;++i)printf("%lld\n",ans[i]);
return 0;
}