比赛 20160407 评测结果 AAAAAAAAAA
题目名称 HH的项链 最终得分 100
用户昵称 Satoshi 运行时间 6.698 s
代码语言 C++ 内存使用 14.81 MiB
提交时间 2016-04-07 09:09:32
显示代码纯文本
#include <fstream>
#include <algorithm>
#define N 1000010
#define M 200010
using namespace std;
ifstream in("diff.in");
ofstream out("diff.out");
int n,m;
int pre[N]={0};
int last[N]={0};
int s[N]={0};
int ans[M]={0};
class interval
{
public:
	int l,r,id;
}q[M];
bool operator <(interval a,interval b)
{
	return a.r<b.r;
}
void add(int x,int y)
{
	int i;
	for(i=x;i<=n;i+=(i&(-i)))s[i]+=y;
}
int sum(int x)
{
	int i,solo=0;
	for(i=x;i>0;i-=(i&(-i)))solo+=s[i];
	return solo;
}
void read()
{
	int i,x;
	in>>n;
	for(i=1;i<=n;i++)
	{
		in>>x;
		pre[i]=last[x];
		last[x]=i;
	}
	in>>m;
	for(i=1;i<=m;i++)
	{
		in>>q[i].l>>q[i].r;
		q[i].id=i;
	}
	sort(q+1,q+m+1);
}
void work()
{
	int i,j;
	for(i=1,j=1;i<=n;i++)
	{
		add(i,1);
		if(pre[i])add(pre[i],-1);
		while(i==q[j].r)
		{
			ans[q[j].id]=sum(q[j].r)-sum(q[j].l-1);
			j++;
		}
	}
	for(i=1;i<=m;i++)out<<ans[i]<<endl;
}
int main()
{
	read();
	work();
	return 0;
}