记录编号 600118 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 蒲公英 最终得分 100
用户昵称 Gravatardjyqjy 是否通过 通过
代码语言 C++ 运行时间 3.095 s
提交时间 2025-04-15 22:14:43 内存使用 6.84 MiB
显示代码纯文本
#include<bits/stdc++.h>
#define int long long
using namespace std;
inline int re()
{
	int f=1,num=0;
	char c=getchar();
	while(c<'0'||c>'9'){if(c=='-') f=-1;c=getchar();}
	while(c>='0'&&c<='9') num=num*10+c-'0',c=getchar();
	return num*f;
}
const int N=40010,K=210;
int n,m,q,k=200,ks,ans,last;
int a[N],ys[N],L[K],R[K],z[K][K],s[K][N],bel[N],ls[N];
int cha(int x)
{
	int l=1,r=m,mid;
	while(l<r)
	{
		mid=(l+r)/2;
		if(ys[mid]>=x) r=mid;
		else l=mid+1;
	}
	return l;
}
int cnt(int l,int r,int z){return ls[z]+s[bel[r]-1][z]-s[bel[l]][z];}
signed main()
{
	freopen("Dandelion.in","r",stdin);
	freopen("Dandelion.out","w",stdout);
	n=re();q=re();ks=(n-1)/k+1;
	for(int i=1;i<ks;i++) L[i]=R[i-1]+1,R[i]=R[i-1]+k;
	L[ks]=R[ks-1]+1;R[ks]=n;
	for(int i=1;i<=n;i++) ys[i]=a[i]=re();
	sort(ys+1,ys+1+n);m=unique(ys+1,ys+1+n)-(ys+1);
	for(int i=1;i<=n;i++) a[i]=cha(a[i]);
	for(int i=1;i<=ks;i++)
	{
		for(int j=L[i];j<=R[i];j++)
		{
			bel[j]=i;
			s[i][a[j]]++;
		}
		for(int j=1;j<=m;j++) s[i][j]+=s[i-1][j];
	}
	for(int i=1;i<=ks;i++) 
	{
		for(int j=i;j<=ks;j++)
		{
			z[i][j]=z[i][j-1];
			for(int k=L[j];k<=R[j];k++)
			{
				ls[a[k]]++;
				if(ls[z[i][j]]<ls[a[k]]||(ls[z[i][j]]==ls[a[k]]&&z[i][j]>a[k])) z[i][j]=a[k];
			}
		}
		for(int k=L[i];k<=n;k++) ls[a[k]]--;
	}
	for(int i=1,l,r;i<=q;i++)
	{
		l=re();r=re();ans=0;
		l=(l+last-1)%n+1;
		r=(r+last-1)%n+1;
		if(l>r) swap(l,r);
		if(bel[l]==bel[r])
		{
			for(int j=l;j<=r;j++)
			{
				ls[a[j]]++;
				if(ls[ans]<ls[a[j]]||(ls[ans]==ls[a[j]]&&ans>a[j])) ans=a[j];
			}
			printf("%lld\n",last=ys[ans]);
			for(int j=l;j<=r;j++) ls[a[j]]--;
			continue;
		}
		for(int j=l;j<=R[bel[l]];j++) ls[a[j]]++;
		for(int j=L[bel[r]];j<=r;j++) ls[a[j]]++;
		for(int j=l;j<=R[bel[l]];j++) if(cnt(l,r,ans)<cnt(l,r,a[j])||(cnt(l,r,ans)==cnt(l,r,a[j])&&ans>a[j])) ans=a[j];
		if(cnt(l,r,ans)<cnt(l,r,z[bel[l]+1][bel[r]-1])||(cnt(l,r,ans)==cnt(l,r,z[bel[l]+1][bel[r]-1])&&ans>z[bel[l]+1][bel[r]-1])) ans=z[bel[l]+1][bel[r]-1];
		for(int j=L[bel[r]];j<=r;j++) if(cnt(l,r,ans)<cnt(l,r,a[j])||(cnt(l,r,ans)==cnt(l,r,a[j])&&ans>a[j])) ans=a[j];
		printf("%lld\n",last=ys[ans]);
		for(int j=l;j<=R[bel[l]];j++) ls[a[j]]--;
		for(int j=L[bel[r]];j<=r;j++) ls[a[j]]--;
	}
	return 0;
}