记录编号 375253 评测结果 AAAAAAAAAA
题目名称 [HZOI 2016]采花 最终得分 100
用户昵称 GravatarFoolMike 是否通过 通过
代码语言 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;
}