bzoj 2743: [HEOI2012]采花
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
#define maxn 1000100
int l[maxn],r[maxn],nn,e[maxn],v[maxn],ne[maxn],op1[maxn],op2[maxn],n,m,c,nex[maxn],now[maxn];
int ans[maxn];
void add(int x,int y){
ne[++nn]=e[x],e[x]=nn,v[nn]=y;
}
int a[maxn],cl[maxn];
int lowbit(int x){
return x&-x;
}
void change(int x,int y){
for(int i=x;i<=n;i+=lowbit(i))a[i]+=y;
}
int sum(int x){
int tot=0;
for(int i=x;i>=1;i-=lowbit(i))tot+=a[i];
return tot;
}
int main(){
scanf("%d%d%d",&n,&c,&m);
for(int i=1;i<=n;i++)scanf("%d",&cl[i]);
for(int i=1;i<=m;i++)scanf("%d%d",&l[i],&r[i]);
for(int i=1;i<=m;i++)add(r[i],i);
int k;
for(int i=n;i>=1;i--){
k=now[cl[i]];
if(k){
nex[i]=k;
op1[k]=i;
if(nex[k])op2[nex[k]]=i;
if(k&&!nex[k])change(i,1);
}
now[cl[i]]=i;
}
for(int i=n;i>=1;i--){
for(int j=e[i];j;j=ne[j]){
ans[v[j]]=sum(r[v[j]])-sum(l[v[j]]-1);
}
if(op1[i])change(op1[i],-1);
if(op2[i])change(op2[i],1);
}
for(int i=1;i<=m;i++)printf("%d\n",ans[i]);
}