分块
但是莫队套分块似乎更快?:http://www.cnblogs.com/clrs97/p/4738181.html
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<cstring>
#define cl(x) memset(x,0,sizeof(x))
using namespace std;
typedef long long ll;
inline char nc()
{
static char buf[100000],*p1=buf,*p2=buf;
if (p1==p2) { p2=(p1=buf)+fread(buf,1,100000,stdin); if (p1==p2) return EOF; }
return *p1++;
}
inline void read(int &x)
{
char c=nc(),b=1;
for (;!(c>='0' && c<='9');c=nc()) if (c=='-') b=-1;
for (x=0;c>='0' && c<='9';x=x*10+c-'0',c=nc()); x*=b;
}
const int M=350;
const int N=100005;
int n,B;
int pos[N],a[N];
int sum[M][N];
ll ans[M][M];
int icnt,sx[N];
inline int Bin(int x){
return lower_bound(sx+1,sx+icnt+1,x)-sx;
}
int clk,tim[N],cnt[N];
inline void Query()
{
int l,r,lp,rp;
ll ret=0;
read(l); read(r); lp=pos[l]; rp=pos[r];
if (lp==rp)
{
++clk;
for (int i=l;i<=r;i++)
{
if (tim[a[i]]!=clk)
tim[a[i]]=clk,cnt[a[i]]=0;
cnt[a[i]]++;
ret=max(ret,(ll)cnt[a[i]]*sx[a[i]]);
}
printf("%lld\n",ret);
return;
}
if (lp+1<=rp-1) ret=ans[lp+1][rp-1];
++clk;
for (int i=l;i<=lp*B;i++)
{
if (tim[a[i]]!=clk)
tim[a[i]]=clk,cnt[a[i]]=(lp+1<=rp-1)?(sum[rp-1][a[i]]-sum[lp][a[i]]):0;
cnt[a[i]]++;
ret=max(ret,(ll)cnt[a[i]]*sx[a[i]]);
}
for (int i=(rp-1)*B+1;i<=r;i++)
{
if (tim[a[i]]!=clk)
tim[a[i]]=clk,cnt[a[i]]=(lp+1<=rp-1)?(sum[rp-1][a[i]]-sum[lp][a[i]]):0;
cnt[a[i]]++;
ret=max(ret,(ll)cnt[a[i]]*sx[a[i]]);
}
printf("%lld\n",ret);
return;
}
int main()
{
ll tem; int Q;
freopen("t.in","r",stdin);
freopen("t.out","w",stdout);
read(n); read(Q);
for (int i=1;i<=n;i++) read(a[i]),sx[++icnt]=a[i];
sort(sx+1,sx+icnt+1); icnt=unique(sx+1,sx+icnt+1)-sx-1;
for (int i=1;i<=n;i++) a[i]=Bin(a[i]);
B=sqrt(n);
for (int i=1;i<=n;i++) pos[i]=(i-1)/B+1,sum[pos[i]][a[i]]++;
for (int i=1;i<=pos[n];i++)
for (int j=1;j<=icnt;j++)
sum[i][j]+=sum[i-1][j];
for (int i=1;i<=pos[n];i++)
{
++clk;
tem=0;
for (int j=(i-1)*B+1;j<=n;j++)
{
if (tim[a[j]]!=clk)
tim[a[j]]=clk,cnt[a[j]]=0;
cnt[a[j]]++;
tem=max(tem,(ll)cnt[a[j]]*sx[a[j]]);
ans[i][pos[j]]=max(ans[i][pos[j]],tem);
}
}
while (Q--)
Query();
return 0;
}