【bzoj2743】[HEOI2012]采花
树状数组
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<queue>
using namespace std;
#define N 1000010
#define lowbit(x) (x & (-x))
int n,c,m;
int t[N],next[N],ans[N],p[N],a[N];
struct Node
{
int l,r,id;
}q[N];
int cmp(Node a,Node b)
{
return a.l<b.l;
}
void update(int x,int d)
{
while (x<=n)
t[x]+=d,x+=lowbit(x);
}
int ask(int x)
{
int res(0);
while (x>0)
res+=t[x],x-=lowbit(x);
return res;
}
int main()
{
scanf("%d%d%d",&n,&c,&m);
for (int i=1;i<=n;i++)
scanf("%d",&a[i]);
for (int i=n;i>0;i--)
next[i]=p[a[i]],p[a[i]]=i;
for (int i=1;i<=c;i++)
if (next[p[i]])
update(next[p[i]],1);
for (int i=1;i<=m;i++)
scanf("%d%d",&q[i].l,&q[i].r),q[i].id=i;
sort(q+1,q+m+1,cmp);
int l=1;
for (int i=1;i<=m;i++)
{
while (l<q[i].l)
{
if (next[l])
update(next[l],-1);
if (next[next[l]])
update(next[next[l]],1);
l++;
}
ans[q[i].id]=ask(q[i].r)-ask(q[i].l-1);
}
for(int i=1;i<=m;i++)
printf("%d\n",ans[i]);
return 0;
}

浙公网安备 33010602011771号