回滚莫队求调 悬一关
查看原帖
回滚莫队求调 悬一关
1164775
Jadonyzx楼主2024/1/12 21:31
#include<bits/stdc++.h>
#define maxn 114514
using namespace std;
int n,m,block,l=1,r=0,_l=1,past=-1;long long ans=0,res=0,ANS[maxn];
int vis[maxn],blo[maxn],a[maxn],_a[maxn],id[maxn],_vis[maxn];
struct node{
	int l,r,id;
}q[maxn]; 
inline int read(){
	int x=0,f=1;
	char ch=getchar();
	while (ch<'0'||ch>'9'){
		if(ch=='-')f=-1;
		ch=getchar();
	}
	while (ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
	return x*f;
}
inline void out(int x){
	if(x<0){
		putchar('-');
		out(-x);
		return ;
	}
	if(x>=10)out(x/10);
	putchar(x%10+'0');
	return ;
}
bool cmp(node a,node b){
	if (blo[a.l]!=blo[b.l])return a.l<b.l;
	return a.r<b.r;
}
void add(int x){
	vis[a[x]]++;
	long long b=vis[a[x]]*_a[a[x]];
	ans=max(ans,b);
	return;
}
void del(int x){
	vis[a[x]]--;
	return;
}
int main(){
	n=read();m=read();block=sqrt(n);
	for (int i = 1;i <= n;i++){
		a[i]=read();
		_a[i]=a[i];
		blo[i]=(i-1)/block+1;
	}
	sort(_a+1,_a+1+n);
	int len=unique(_a+1,_a+1+n)-(_a+1);
	for (int i = 1;i <= n;i++)a[i]=lower_bound(_a+1,_a+len+1,a[i])-_a;
	for (int i = 1;i <= m;i++){
		q[i].l=read();
		q[i].r=read();
		q[i].id=i;
	}
	sort(q+1,q+1+m,cmp);
	for (int i = 1;i <= m;i++){
		if (blo[q[i].l]==blo[q[i].r]){
			memset(_vis,0,sizeof(_vis));
			long long tmpd=0;
			for (int j = q[i].l;j <= q[i].r;j++){
				_vis[a[j]]++;
				long long b=_vis[a[j]]*_a[a[j]];
				tmpd=max(tmpd,b);
			}
			for (int j = q[i].l;j <= q[i].r;j++){
				_vis[a[j]]--;
			}
			ANS[q[i].id]=tmpd;l=blo[q[i].l]*block,r=l-1;
		}
		else if(blo[q[i].l]==past){
			while (r<q[i].r)add(++r);
			res=ans;
			_l=l;
			while (_l>q[i].l)add(--_l);
			ANS[q[i].id]=ans;
			ans=res;
			while (_l<l)del(_l++);
		}
		else{
			memset(vis,0,sizeof(vis));
			l=blo[q[i].l]*block;r=l-1;
			_l=blo[q[i].l]*block;
			ans=0;
			while (r<q[i].r)add(++r);
			res=ans;
			while (_l>q[i].l)add(--_l);
			ANS[q[i].id]=ans;
			ans=res;
			while (_l<l)del(_l++);
		}
	}
	for (int i = 1;i <= m;i++){
		out(ANS[i]);
		putchar('\n');
	}
	return 0;
}
2024/1/12 21:31
加载中...