at记录
#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <math.h>
#include <unordered_map>
#define int long long
#define maxn 100001
using namespace std;
struct MD{
int l,r,lk,k;
}q[maxn];
unordered_map <int,int> H;
int n,m,A[maxn],siz,cnt[maxn],an,ans[maxn];
int z[maxn],rA[maxn];
bool operator < (MD x,MD y)
{
if( x.lk == y.lk )
return x.r < y.r;
return x.l < y.l;
}
void add(int x)
{
cnt[A[x]]++;
an = max(rA[A[x]]*cnt[A[x]],an);
return ;
}
signed main()
{
scanf("%lld%lld",&n,&m);
siz = sqrt(n);
for(int i=1;i<=n;i++)
scanf("%lld",&A[i]),z[i] = A[i];
sort(z+1,z+n+1);
for(int i=1,tot=0;i<=n;i++)
if(z[i]!=z[i-1])
H[z[i]] = ++tot;
for(int i=1;i<=n;i++)
rA[H[A[i]]] = A[i],A[i] = H[A[i]];
for(int i=1;i<=m;i++)
scanf("%lld%lld",&q[i].l,&q[i].r),q[i].lk = q[i].l/siz+1,q[i].k = i;
sort(q+1,q+m+1);
int nowl,nowr;
bool type = true;
for(int i=1;i<=m;i++)
{
an = 0;
if(q[i].lk==q[i].r/siz+1)
{
for(int j=q[i-1].l;j<=q[i-1].r;j++)
cnt[A[j]]--;
for(int j=q[i].l;j<=q[i].r;j++)
add(j);
type = true;
}
else
{
for(int j=q[i-1].l;j<=q[i-1].lk*siz;j++)
cnt[A[j]]--;
nowl = q[i].lk*siz+1;
if(q[i-1].lk!=q[i].lk||type)
{
nowr = q[i].lk*siz,type = false;
for(int j=q[i-1].lk*siz+1;j<=q[i-1].r;j++)
cnt[A[j]]--;
}
while(q[i].l<nowl) add(--nowl);
while(nowr<q[i].r) add(++nowr);
}
ans[q[i].k] = an;
}
for(int i=1;i<=m;i++)
printf("%lld\n",ans[i]);
return 0;
}