#include<bits/stdc++.h>
#define int long long
using namespace std ;
const int N = 2e5 + 5 ;
int a[N] , b[N] ;
int cnt[N] ;
int si ;
int n , m ;
struct node{
int l , r ;
int id ;
} q[N] ;
int L[N] , R[N] ;
int blo[N] ;
long long ans[N] ;
int l = 0 , r = 0 , tmp = 0 , ti = 0 ;
bool cmp( node x , node y ) {
return ( blo[ x.l ] == blo[ y.l ] ) ? ( x.r < y.r ) : ( blo[ x.l ] == blo[ y.l ] ) ;
}
int js( int lt , int rt ) {
long long to[N] ;
long long anst = 0 ;
for ( int i = lt ; i <= rt ; i++ ) {
++to[ a[i] ] ;
}
for ( int i = lt ; i <= rt ; i++ ) {
anst = max( anst , to[ a[i] ] * b[ a[i] ] ) ;
}
for ( int i = lt ; i <= rt ; i++ ) {
--to[ a[i] ] ;
}
return anst ;
}
void add( int x ) {
cnt[ a[x] ]++ ;
tmp = max( tmp , cnt[ a[x] ] * b[ a[x] ] ) ;
}
signed main( ) {
ios::sync_with_stdio( false ) ;
cin.tie( 0 ) , cout.tie( 0 ) ;
cin >> n >> m ;
si = sqrt( n ) ;
for ( int i = 1 ; i <= n ; i++ ) {
cin >> a[i] ;
b[i] = a[i] ;
}
for ( int i = 1 ; i <= m ; i++ ) {
cin >> q[i].l >> q[i].r ;
q[i].id = i ;
}
sort( b + 1 , b + n + 1 ) ;
int u = unique( b + 1 , b + n + 1 ) - b - 1 ;
for ( int i = 1 ; i <= n ; i++ ) {
a[i] = lower_bound( b + 1 , b + u + 1 , a[i] ) - b ;
}
int bl = n / si ;
for ( int i = 1 ; i <= bl ; i++ ) {
L[i] = R[ i - 1 ] + 1 ;
R[i] = L[i] + si - 1 ;
}
if ( R[bl] < n ) {
bl++ ;
L[bl] = R[ bl - 1 ] + 1 ;
R[bl] = n ;
}
for ( int i = 1 ; i <= n ; i++ ) {
blo[i] = ( i - 1 ) / si + 1 ;
}
sort( q + 1 , q + m + 1 , cmp ) ;
for ( int i = 1 , l = 0 , r = 0 , ti = 1 ; i <= bl ; i++ ) {
tmp = 0 ;
memset( cnt , 0 , sizeof( cnt ) ) ;
r = R[i] ;
while ( blo[ q[ti].l ] == i ) {
l = R[i] + 1 ;
if ( q[ti].r - q[ti].l <= si ) {
ans[ q[ti].id ] = js( q[ti].l , q[ti].r ) ;
ti++ ;
continue ;
}
while ( q[ti].r > r ) {
add( ++r ) ;
}
long long now = tmp ;
while ( l > q[ti].l ) {
add( --l ) ;
}
ans[ q[ti].id ] = tmp ;
tmp = now ;
while ( l <= R[i] ) {
--cnt[ a[ l++ ] ] ;
}
ti++ ;
}
}
for ( int i = 1 ; i <= m ; i++ ) {
cout << ans[i] << endl ;
}
return 0 ;
}