比赛 |
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;
}