记录编号 251118 评测结果 WWWWWWWWWWWWWWWWWWWW
题目名称 数字查询 最终得分 0
用户昵称 Gravatar咸鱼二号 是否通过 未通过
代码语言 C++ 运行时间 6.017 s
提交时间 2016-04-16 21:38:34 内存使用 65.33 MiB
显示代码纯文本
#include<iostream>
#include<cstring>
#include<cstdio>
#include<string>
#include<algorithm>
#include<cmath>
#include<utility>
#include<cstdlib>
#include<iomanip>	//cout<<setiosflags(ios::fixed)<<setprecision(2);
#include<ctime> //double a=(double)clock();	cout<<a<<endl;
#include<vector>
#include<queue>
using namespace std;
const int maxn=40010;
inline int read(){
	int x=0,ff=1;char ch=getchar();
	while(ch>'9'||ch<'0'){if(ch=='-')ff=-1; ch=getchar();}
	while(ch<='9'&&ch>='0'){x=x*10+ch-'0';ch=getchar();}
	return ff*x;
}
inline int mymin(int xx,int yy)
{if(xx<yy)return xx;return yy;}
inline int mymax(int xx,int yy)
{if(xx<yy)return yy;return xx;}
inline void myswap(int &xx,int &yy)
{xx^=yy,yy^=xx,xx^=yy;}
int N,M,cnt=0,len=200,block,L,R,x=0,maxx,now,k;
int a[maxn],s[210][40010],ans[210][40010],vis[40010],p[40010],check[40010],tim;
struct stru{
	int id,v;
}c[maxn];
inline bool mycmp1(const stru &A,const stru &B)
{return A.id<B.id;}
inline bool mycmp2(const stru &A,const stru &B)
{return A.v<B.v;}
void pre(){
	//len=(int)sqrt(1.0*N);
	k=N/len;
	if(N%len)k++;
	for(int i=1;i<=k;i++){
		for(int j=1;j<=cnt;j++)
			s[i][j]=s[i-1][j];
		L=(i-1)*len+1,R=mymin(i*len,N);
		for(int j=L;j<=R;j++)
			s[i][c[j].v]++;
	}
	for(int i=1;i<=k;i++){
		memset(vis,0,sizeof(vis));
		maxx=0,now=cnt+1;
		for(int j=i;j<=k;j++){
			L=(j-1)*len+1,R=mymin(i*len,N);
			for(int o=L;o<=R;o++){
				vis[c[o].v]++;
				if(vis[c[o].v]>maxx||(vis[c[o].v]==maxx&&c[o].v<now))
					maxx=vis[c[o].v],now=c[o].v;
			}
			ans[i][j]=now;
		}
	}
}
void query(int X,int Y){
	int A=(X-1)/len+1,B=(Y-1)/len+1;
	tim++;
	if(A==B||A==B-1){
		maxx=0,now=cnt+1;
		for(int i=X;i<=Y;i++){
			if(check[c[i].v]!=tim)check[c[i].v]=tim,vis[c[i].v]=0;
			vis[c[i].v]++;
			if(vis[c[i].v]>maxx||(vis[c[i].v]==maxx&&now>c[i].v))
				maxx=vis[c[i].v],now=c[i].v;
		}
	}
	else{
		now=ans[A+1][B-1];
		maxx=s[B-1][now]-s[A][now];//不计算L和R
		L=A*len,R=(B-1)*len+1;
		for(int i=X;i<=L;i++){
			if(check[c[i].v]!=tim)check[c[i].v]=tim,vis[c[i].v]=0;
			vis[c[i].v]++;
		}
		for(int i=R;i<=Y;i++){
			if(check[c[i].v]!=tim)check[c[i].v]=tim,vis[c[i].v]=0;
			vis[c[i].v]++;
		}
		for(int i=X;i<=L;i++){
			int cur=vis[c[i].v]+s[B-1][c[i].v]-s[A][c[i].v];
			if(cur>maxx||(cur==maxx&&now>c[i].v))
				maxx=cur,now=c[i].v;
		}
		for(int i=R;i<=Y;i++){
			int cur=vis[c[i].v]+s[B-1][c[i].v]-s[A][c[i].v];
			if(cur>maxx||(cur==maxx&&now>c[i].v))
				maxx=cur,now=c[i].v;
		}
	}
	x=p[c[now].v];
	printf("%d\n",x);
}
int main(){
	freopen("numquery.in","r",stdin);
	freopen("numquery.out","w",stdout);
	N=read(),M=read();
	for(int i=1;i<=N;i++)
		c[i].v=a[i]=read(),c[i].id=i;
	sort(c+1,c+1+N,mycmp2);
	for(int i=1;i<=N;i++){
		if(c[i].v!=c[i-1].v)
			c[i].v=++cnt;
		else c[i].v=cnt;
		p[cnt]=c[i].v;
	}
	sort(c+1,c+1+N,mycmp1);
	pre();
	while(M--){
		L=read(),R=read();
		L=(L+x-1)%N+1,R=(R+x-1)%N+1;
		if(L>R)
			myswap(L,R);
		query(L,R);
	}
	return 0;
}