记录编号 331085 评测结果 AAAAAAAAAT
题目名称 [HZOI 2015]疯狂的颜色序列 最终得分 90
用户昵称 GravatarAntiLeaf 是否通过 未通过
代码语言 C++ 运行时间 6.420 s
提交时间 2016-10-27 08:22:45 内存使用 149.77 MiB
显示代码纯文本
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=500010;
void build(int,int,int&,int);
void qsum(int,int,int,int);
int sm[maxn<<5],lc[maxn<<5],rc[maxn<<5],root[maxn],cnt=0;
int n,m,prev[maxn]={0},x,y,l,r,ans;
int main(){
#define MINE
#ifdef MINE
	freopen("color_seq.in","r",stdin);
	freopen("color_seq.out","w",stdout);
#endif
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++){
		scanf("%d",&y);
		x=prev[y]+1;
		build(1,n,root[i],root[i-1]);
		prev[y]=i;
	}
	while(m--){
		scanf("%d%d",&l,&r);
		l=(l+ans)%n+1;
		r=(r+ans)%n+1;
		if(l>r)swap(l,r);
		x=l;
		ans=0;
		qsum(1,n,root[r],root[l-1]);
		printf("%d\n",ans);
	}
#ifndef MINE
	printf("\n--------------------DONE--------------------\n");
	for(;;);
#endif
	return 0;
}
void build(int l,int r,int &rt,int pr){
	sm[rt=++cnt]=sm[pr]+1;
	if(l==r)return;
	lc[rt]=lc[pr];rc[rt]=rc[pr];
	int mid=(l+r)>>1;
	if(x<=mid)build(l,mid,lc[rt],lc[pr]);
	else build(mid+1,r,rc[rt],rc[pr]);
}
void qsum(int l,int r,int rt,int pr){
	if(!rt&&!pr)return;
	if(x>=r){
		ans+=sm[rt]-sm[pr];
		return;
	}
	int mid=(l+r)>>1;
	qsum(l,mid,lc[rt],lc[pr]);
	if(x>mid)qsum(mid+1,r,rc[rt],rc[pr]);
}