记录编号 |
331085 |
评测结果 |
AAAAAAAAAT |
题目名称 |
[HZOI 2015]疯狂的颜色序列 |
最终得分 |
90 |
用户昵称 |
AntiLeaf |
是否通过 |
未通过 |
代码语言 |
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]);
}