%%%PBS教我打配对堆
配对堆的速度是set的6倍。。
#include<bits/stdc++.h>
#include<ext/pb_ds/priority_queue.hpp>
using namespace std;
using namespace __gnu_pbds;
inline char nc(){
static char buf[100000],*p1=buf,*p2=buf;
return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;
}
inline void Read(int& x){
char c=nc();
for(;c<'0'||c>'9';c=nc());
for(x=0;c>='0'&&c<='9';x=(x<<3)+(x<<1)+c-48,c=nc());
}
typedef long long ll;
typedef pair<int,int> abcd;
typedef __gnu_pbds::priority_queue<ll,less<ll>,pairing_heap_tag> heap;
const int N=100010;
heap Q;
heap::point_iterator p[N];
char ss[30];
int Len;
inline void Print(ll x){
if(!x){
putchar(48);putchar('\n');
return;
}
for(Len=0;x;x/=10)ss[++Len]=x%10;
while(Len)putchar(ss[Len--]+48);
putchar('\n');
}
#define fi first
#define se second
abcd d[N];
int k,n,m,q;
int s,b[N];
int a[N],w[N],num;
int L=1,R;
ll sum[N],Res,Ans[N];
struct Node{
int l,r,id;
inline bool operator < (Node x)const{
if(b[l]!=b[x.l])return b[l]<b[x.l];
return (b[l]&1?r<x.r:r>x.r);
}
}c[N];
inline void Update(int x,int d){
sum[w[x]]+=a[x]*d;
Q.modify(p[w[x]],sum[w[x]]);
}
int main(){
Read(n);Read(q);s=sqrt(n);
for(int i=1;i<=n;i++)b[i]=(i-1)/s+1,Read(a[i]),d[i].fi=a[i],d[i].se=i;
sort(d+1,d+n+1);
w[d[1].se]=num=1;
for(int i=2;i<=n;i++)
if(d[i].fi==d[i-1].fi)w[d[i].se]=num;else w[d[i].se]=++num;
for(int i=1;i<=q;i++)Read(c[i].l),Read(c[i].r),c[i].id=i;
sort(c+1,c+q+1);
for(int i=1;i<=num;i++)p[i]=Q.push(0);
for(int i=1;i<=q;i++){
while(R<c[i].r)Update(++R,1);
while(L>c[i].l)Update(--L,1);
while(R>c[i].r)Update(R--,-1);
while(L<c[i].l)Update(L++,-1);
Ans[c[i].id]=Q.top();
}
for(int i=1;i<=q;i++)Print(Ans[i]);
return 0;
}