记录编号 498321 评测结果 AAAAAAAAAA
题目名称 [SDOI 2009] HH的项链 最终得分 100
用户昵称 GravatarAntiLeaf 是否通过 通过
代码语言 C++ 运行时间 0.522 s
提交时间 2018-06-12 17:49:27 内存使用 8.70 MiB
显示代码纯文本
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
const int maxn=200005;
struct Q{
	int l,id;
	Q(int l,int id):l(l),id(id){}
};
void add(int,int);
int query(int);
vector<Q>q[maxn];
int n,m,a[maxn],p[1000005],c[maxn],ans[maxn];
int main(){
	freopen("diff.in","r",stdin);
	freopen("diff.out","w",stdout);
	scanf("%d",&n);
	for(int i=1;i<=n;i++)scanf("%d",&a[i]);
	scanf("%d",&m);
	for(int i=1,l,r;i<=m;i++){
		scanf("%d%d",&l,&r);
		q[r].push_back(Q(l,i));
	}
	for(int i=1;i<=n;i++){
		add(p[a[i]]+1,1);
		add(i+1,-1);
		p[a[i]]=i;
		for(int j=0;j<(int)q[i].size();j++)ans[q[i][j].id]=query(q[i][j].l);
	}
	for(int i=1;i<=m;i++)printf("%d\n",ans[i]);
	return 0;
}
void add(int x,int d){
	while(x<=n){
		c[x]+=d;
		x+=x&-x;
	}
}
int query(int x){
	int ans=0;
	while(x){
		ans+=c[x];
		x&=x-1;
	}
	return ans;
}