第一个点就错了。。。
#include<bits/stdc++.h>
using namespace std;
#define N 100005
long long n,m;
long long x[N];
long long xfx[N];
struct ASK
{
long long l,r,id;
}ask[N];
long long ans[N];
long long a[N];
long long tong[N];
long long kc;
bool cmp(ASK a,ASK b)
{
if(a.l/kc!=b.l/kc)
return a.l/kc<b.l/kc;
return a.r<b.r;
}
long long blk[N],blkcnt=0;
queue<pair<long long,long long> > qu;
int main()
{
freopen("my.in","r",stdin);
freopen("my.out","w",stdout);
scanf("%lld%lld",&n,&m);
kc=sqrt(n);
for(long long i=1;i<=n;i++)
scanf("%d",&x[i]),xfx[i]=x[i];
for(long long i=1;i<=m;i++)
{
scanf("%lld%lld",&ask[i].l,&ask[i].r);
ask[i].id=i;
}
sort(ask+1,ask+1+m,cmp);
sort(xfx+1,xfx+1+n);
long long tmpp=unique(xfx+1,xfx+1+n)-xfx;
for(long long i=1;i<=n;i++)
a[i]=lower_bound(xfx+1,xfx+1+tmpp,x[i])-xfx;
blk[++blkcnt]=1;
for(long long i=2;i<=m;i++)
if(ask[i-1].l/kc!=ask[i].l/kc)
blk[++blkcnt]=i;
blk[blkcnt+1]=m+1;
for(long long i=1;i<=blkcnt;i++)
{
long long nowans=0;
memset(tong,0,sizeof(tong));
long long nl,nr;
nl=floor(1.0*ask[blk[i]].l/kc)*kc+kc-1;
nr=nl-1;
for(long long j=blk[i];j<blk[i+1];j++)
{
if(ask[j].r/kc==ask[j].l/kc)
{
nowans=0;
for(long long kk=ask[j].l;kk<=ask[j].r;kk++)
{
tong[a[kk]]++;
nowans=max(nowans,tong[a[kk]]*x[kk]);
}
ans[ask[j].id]=nowans;
for(long long kk=ask[j].l;kk<=ask[j].r;kk++)
tong[a[kk]]--;
}
else
{
int tmpnl=nl;
while(nr<ask[j].r)
{
nr++;
tong[a[nr]]++;
nowans=max(nowans,tong[a[nr]]*x[nr]);
}
long long tmpans=nowans;
while(nl>ask[j].l)
{
nl--;
tong[a[nl]]++;
tmpans=max(tmpans,tong[a[nl]]*x[nl]);
qu.push(make_pair(a[nl],tong[a[nl]]-1));
}
ans[ask[j].id]=tmpans;
while(qu.size())
{
auto aa=qu.front();
qu.pop();
tong[aa.first]=aa.second;
}
nl=tmpnl;
}
}
}
for(long long i=1;i<=m;i++)
printf("%lld\n",ans[i]);
return 0;
}