记录编号 |
375253 |
评测结果 |
AAAAAAAAAA |
题目名称 |
[HZOI 2016]采花 |
最终得分 |
100 |
用户昵称 |
FoolMike |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
3.543 s |
提交时间 |
2017-02-24 22:13:38 |
内存使用 |
23.19 MiB |
显示代码纯文本
#include<cstdio>
#include<queue>
using namespace std;
const int N=1e6+10;
int n,m,c,a[N],ans;
vector<int> E[N];
struct node{
int s;
node *lc,*rc;
node(int S=0){s=S;lc=rc=0;}
}*root[N],*Root[N];int T;
void build(node *x,int l,int r){
if (l==r) return;
int mid=(l+r)>>1;
x->lc=new node();
x->rc=new node();
build(x->lc,l,mid);
build(x->rc,mid+1,r);
}
void add(int p,int d){
node *x=root[T],*y=root[++T]=new node();
int l=1,r=n;
while (1){
*y=*x;y->s+=d;
if (l==r) break;
int mid=(l+r)>>1;
if (p>mid) y=y->rc=new node(),x=x->rc,l=mid+1;
else y=y->lc=new node(),x=x->lc,r=mid;
}
}
int query(node *x,int p){
int l=1,r=n,ans=0;
while (1){
if (r<=p) return ans+x->s;
int mid=(l+r)>>1;
if (p>mid) ans+=x->lc->s,x=x->rc,l=mid+1;
else x=x->lc,r=mid;
}
}
int main()
{
freopen("flower++.in","r",stdin);
freopen("flower++.out","w",stdout);
scanf("%d%d%d",&n,&c,&m);
for (int i=1;i<=c;i++) E[i].push_back(0);
Root[0]=root[0]=new node();
build(root[0],1,n);
for (int i=1;i<=n;i++){
scanf("%d",&a[i]);
E[a[i]].push_back(i);
int S=E[a[i]].size()-1;
if (S>=2){
add(E[a[i]][S-2]+1,1);
add(E[a[i]][S-1]+1,-1);
}
Root[i]=root[T];
}
for (int i=1;i<=m;i++){
int l,r;
scanf("%d%d",&l,&r);
l^=ans;r^=ans;
printf("%d\n",ans=query(Root[r],l)-query(Root[l-1],l));
}
return 0;
}