#include<bits/stdc++.h>
#define maxn 114514
using namespace std;
int n,m,block,l=1,r=0,_l=1,past=-1;long long ans=0,res=0,ANS[maxn];
int vis[maxn],blo[maxn],a[maxn],_a[maxn],id[maxn],_vis[maxn];
struct node{
int l,r,id;
}q[maxn];
inline int read(){
int x=0,f=1;
char ch=getchar();
while (ch<'0'||ch>'9'){
if(ch=='-')f=-1;
ch=getchar();
}
while (ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
return x*f;
}
inline void out(int x){
if(x<0){
putchar('-');
out(-x);
return ;
}
if(x>=10)out(x/10);
putchar(x%10+'0');
return ;
}
bool cmp(node a,node b){
if (blo[a.l]!=blo[b.l])return a.l<b.l;
return a.r<b.r;
}
void add(int x){
vis[a[x]]++;
long long b=vis[a[x]]*_a[a[x]];
ans=max(ans,b);
return;
}
void del(int x){
vis[a[x]]--;
return;
}
int main(){
n=read();m=read();block=sqrt(n);
for (int i = 1;i <= n;i++){
a[i]=read();
_a[i]=a[i];
blo[i]=(i-1)/block+1;
}
sort(_a+1,_a+1+n);
int len=unique(_a+1,_a+1+n)-(_a+1);
for (int i = 1;i <= n;i++)a[i]=lower_bound(_a+1,_a+len+1,a[i])-_a;
for (int i = 1;i <= m;i++){
q[i].l=read();
q[i].r=read();
q[i].id=i;
}
sort(q+1,q+1+m,cmp);
for (int i = 1;i <= m;i++){
if (blo[q[i].l]==blo[q[i].r]){
memset(_vis,0,sizeof(_vis));
long long tmpd=0;
for (int j = q[i].l;j <= q[i].r;j++){
_vis[a[j]]++;
long long b=_vis[a[j]]*_a[a[j]];
tmpd=max(tmpd,b);
}
for (int j = q[i].l;j <= q[i].r;j++){
_vis[a[j]]--;
}
ANS[q[i].id]=tmpd;l=blo[q[i].l]*block,r=l-1;
}
else if(blo[q[i].l]==past){
while (r<q[i].r)add(++r);
res=ans;
_l=l;
while (_l>q[i].l)add(--_l);
ANS[q[i].id]=ans;
ans=res;
while (_l<l)del(_l++);
}
else{
memset(vis,0,sizeof(vis));
l=blo[q[i].l]*block;r=l-1;
_l=blo[q[i].l]*block;
ans=0;
while (r<q[i].r)add(++r);
res=ans;
while (_l>q[i].l)add(--_l);
ANS[q[i].id]=ans;
ans=res;
while (_l<l)del(_l++);
}
}
for (int i = 1;i <= m;i++){
out(ANS[i]);
putchar('\n');
}
return 0;
}