#include<bits/stdc++.h>
using namespace std;
const int MAXN = 1e5 + 5;
struct query{
int l,r,id;
}q[MAXN];
int n,a[MAXN],ans[MAXN],__cnt[MAXN],belong[MAXN],b[MAXN],cnt[MAXN],L[MAXN],R[MAXN],mm;
map<int,int> m;
bool cmp(query a,query b){
return belong[a.l] ^ belong[b.l] ? belong[a.l] < belong[b.l] : (belong[a.l] & 1 ? a.r < b.r : a.r > b.r);
}
int main(){
cin >> n >> mm;
int size = sqrt(n);
int num = ceil((double)n / size);
for(int i = 1; i <= num; i++){
for(int j = (i - 1) * size + 1; j <= i * size; j++){
belong[j] = i;
}
L[i] = (i - 1) * size + 1;
R[i] = min(i * size,n);
}
for(int i = 1; i <= n; i++){
cin >> a[i];
b[i] = a[i];
}
sort(b + 1,b + 1 + n);
for(int i = 1; i <= n; i++){
if(m.find(b[i]) == m.end())m[b[i]] = i;
}
for(int i = 1; i <= n; i++){
a[i] = m[a[i]];
}
for(int i = 1; i <= mm; i++){
cin >> q[i].l >> q[i].r;
q[i].id = i;
}
sort(q + 1,q + 1 + mm,cmp);
int l = 1,r = 0,__l,last_block;
for(int i = 1; i <= mm; i++){
if(belong[q[i].l] == belong[q[i].r]){
for(int j = q[i].l; j <= q[i].r; j++){
__cnt[a[j]]++;
}
for(int j = q[i].l; j <= q[i].r; j++){
ans[q[i].id] = max(ans[q[i].id],b[a[j]] * __cnt[a[j]]);
}
for(int j = q[i].l; j <= q[i].r; j++){
__cnt[a[j]]--;
}
continue;
}
if(belong[q[i].l] != last_block){
while(r > R[belong[q[i].l]]){
cnt[a[r]]--;
--r;
}
while(l < R[belong[q[i].l]] + 1){
cnt[a[l]]--;
++l;
}
last_block = belong[q[i].l];
}
while(r < q[i].r){
++r;
cnt[a[r]]++;
ans[q[i].id] = max(ans[q[i].id],cnt[a[r]] * b[a[r]]);
}
__l = l;
while(__l > q[i].l){
--__l;
cnt[a[__l]]++;
ans[q[i].id] = max(ans[q[i].id],cnt[a[__l]] * b[a[__l]]);
}
while(__l < l){
cnt[a[__l]]--;
++__l;
}
}
for(int i = 1; i <= mm; i++){
cout << ans[i] << "\n";
}
}