#include<bits/stdc++.h>
#define ll long long
using namespace std;
int c[100005],a[100005],b[100005],bl,n,m,d;//bl 块长
ll ans,backans,qans[100005];
struct query{int l,r,id;}q[100005];
inline int read()
{
int x_=0;char c_=getchar();
while(!isdigit(c_))c_=getchar();
while(isdigit(c_))x_=(x_<<3)+(x_<<1)+(c_^48),c_=getchar();
return x_;
}
bool operator < (const query &a,const query &b)
{
return a.l/bl ^ b.l/bl ? a.l<b.l : a.r<b.r;
}
inline void add(int pos)
{
ans=max((ll)(++c[a[pos]])*b[a[pos]],ans);
}
int main()
{
n=read(),m=read();
for(int i=1;i<=n;++i)a[i]=b[i]=read();
sort(b+1,b+n+1);
d=unique(b+1,b+n+1)-b-1;
for(int i=1;i<=n;++i)
a[i]=lower_bound(b+1,b+d+1,a[i])-b;//离散化
bl=sqrt(n);
for(int i=1;i<=m;++i)
{
q[i].l=read(),q[i].r=read(),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+m+1);
for(int i=1,l=bl,r=bl-1,bi=0;q[i].l<=n&&i<=m;++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<=m;++i)
printf("%lld\n",qans[i]);
return 0;
}
求求了