歴史の研究 回滚莫队板子求调
查看原帖
歴史の研究 回滚莫队板子求调
401479
LuckiestShawn楼主2023/7/19 10:11

at记录

#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <math.h>
#include <unordered_map>
#define int long long
#define maxn 100001
using namespace std;
struct MD{
	int l,r,lk,k;
}q[maxn];
unordered_map <int,int> H;
int n,m,A[maxn],siz,cnt[maxn],an,ans[maxn];
int z[maxn],rA[maxn];
bool operator < (MD x,MD y)
{
	if( x.lk == y.lk )
		return x.r < y.r;
	return x.l < y.l;
}
void add(int x)
{
	cnt[A[x]]++;
	an = max(rA[A[x]]*cnt[A[x]],an);
	return ;
}
signed main()
{
	scanf("%lld%lld",&n,&m);
	
	siz = sqrt(n);
	
	for(int i=1;i<=n;i++)
		scanf("%lld",&A[i]),z[i] = A[i];
	sort(z+1,z+n+1);
	for(int i=1,tot=0;i<=n;i++)
		if(z[i]!=z[i-1])
			H[z[i]] = ++tot;
	for(int i=1;i<=n;i++)
		rA[H[A[i]]] = A[i],A[i] = H[A[i]];
	
//	for(int i=1;i<=n;i++)
//		printf("%d ",A[i]); puts("");
	
	for(int i=1;i<=m;i++)
		scanf("%lld%lld",&q[i].l,&q[i].r),q[i].lk = q[i].l/siz+1,q[i].k = i;
	
	
	sort(q+1,q+m+1);
	
	int nowl,nowr;
	bool type = true;
	for(int i=1;i<=m;i++)
	{
		an = 0;
		if(q[i].lk==q[i].r/siz+1)
		{
			for(int j=q[i-1].l;j<=q[i-1].r;j++)
				cnt[A[j]]--;
			
//			printf("| %d %d\n",q[i].l,q[i].r);
			
			for(int j=q[i].l;j<=q[i].r;j++)
				add(j);
			
			type = true;
		}
		else
		{
			for(int j=q[i-1].l;j<=q[i-1].lk*siz;j++)
				cnt[A[j]]--;
			nowl = q[i].lk*siz+1;
			
//			printf("%d %d\n",q[i-1].lk,q[i].lk);
			
			if(q[i-1].lk!=q[i].lk||type)
			{
				nowr = q[i].lk*siz,type = false;
				for(int j=q[i-1].lk*siz+1;j<=q[i-1].r;j++)
					cnt[A[j]]--;
			}
			
//			printf("| %d %d | %d %d\n",q[i].l,q[i].r,nowl,nowr);
			
			while(q[i].l<nowl) add(--nowl);
			while(nowr<q[i].r) add(++nowr); 
			
		}
		
//		printf("| an: %d |\n\n",an);
		
		ans[q[i].k] = an;
		
	}
	
	for(int i=1;i<=m;i++)
		printf("%lld\n",ans[i]);
	
	
	
	
	return 0;
}
2023/7/19 10:11
加载中...