记录编号 483307 评测结果 AAAAAAAAAA
题目名称 [SDOI 2009] HH的项链 最终得分 100
用户昵称 GravatarShirry 是否通过 通过
代码语言 C++ 运行时间 1.475 s
提交时间 2018-01-16 09:58:20 内存使用 7.34 MiB
显示代码纯文本
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=200010;
const int maxm=50010;
struct poi{int l,r,id;}q[maxn];
int n,m,ans,Block,a[maxm],Ans[maxn],vis[1000010];
bool cmp(poi x,poi y){
	if(x.l/Block!=y.l/Block)return x.l<y.l;
	else return x.r<y.r;
}
void add(int x){
	vis[a[x]]++;
	if(vis[a[x]]==1)ans++;
}
void remove(int x){
	vis[a[x]]--;
	if(!vis[a[x]])ans--;
}
int main(){
	freopen("diff.in","r",stdin);
	freopen("diff.out","w",stdout);
	scanf("%d",&n);Block=sqrt(double(n));
	for(int i=1;i<=n;i++)scanf("%d",&a[i]);
	scanf("%d",&m);
	for(int i=1;i<=m;i++)scanf("%d%d",&q[i].l,&q[i].r),q[i].id=i;
	sort(q+1,q+1+m,cmp);
	int L=0,R=0;ans=0;
	for(int i=1;i<=m;i++){
		while(L<q[i].l)remove(L),L++;
		while(L>q[i].l)L--,add(L);
		while(R<q[i].r)R++,add(R);
		while(R>q[i].r)remove(R),R--;
		Ans[q[i].id]=ans;
	}
	for(int i=1;i<=m;i++)printf("%d\n",Ans[i]);
	return 0;
}