代码还没来得及写离散化,但样例好像过不去。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int sz;
struct nd{
int l,r,v;
inline bool operator<(nd a){
if(l/sz!=a.l/sz) return l<a.l;
return r<a.r;
}
}q[100010];
int n,m,a[100010],cnt[100010],l=1,r,lt,lb;
ll ans[100010],res,tp;
inline void add(int u){
cnt[u]++;
res=max(res,1ll*cnt[u]*u);
}
inline void del(int u){
cnt[u]--;
}
inline int pos(int u){
return (u+sz-1)/sz;
}
inline int ed(int u){
return min(u*sz,n);
}
int main(){
scanf("%d%d",&n,&m);
sz=sqrt(n);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
for(int i=1;i<=m;i++){
scanf("%d%d",&q[i].l,&q[i].r);
q[i].v=i;
}
sort(q+1,q+m+1);
for(int i=1;i<=m;i++){
if(pos(q[i].l)==pos(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].v]=max(ans[q[i].v],1ll*cnt[a[j]]*a[j]);
}
for(int j=q[i].l;j<=q[i].r;j++) cnt[a[j]]--;
continue;
}
if(pos(q[i].l)!=lb){
while(r>ed(pos(q[i].l))) del(a[r--]);
while(l<ed(pos(q[i].l))+1) del(a[l++]);
res=0;
lb=pos(q[i].l);
}
while(r<q[i].r) add(a[++r]);
lt=l;
tp=res;
while(lt>q[i].l) add(a[--lt]);
ans[q[i].v]=res;
res=tp;
while(lt<l) del(a[lt++]);
}
for(int i=1;i<=m;i++){
printf("%lld\n",ans[i]);
}
}