HH的项链 树状数组 ( 离线 )
作者:
张嘉文
,
2022-01-26 16:49:01
,
所有人可见
,
阅读 190
#include "bits/stdc++.h"
const int N = (int)2e6+10;
using namespace std;
struct query{
int l,r,times;
bool friend operator < (query x,query y){
return x.r<y.r;
}
}q[N];
int tr[N],f[N],pre[N],las[N],ans[N];
int n,c,m;
int lowbit(int x){
return x&-x;
}
void add(int x,int val){
if(!x)return ;
for(int i=x;i<=n;i+= lowbit(i))tr[i]+=val;
}
int sum(int x){
int res = 0;
for(int i=x;i;i-= lowbit(i))res+=tr[i];
return res;
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%d",&f[i]);
scanf("%d",&m);
for(int i=1;i<=m;i++){
int l,r;
scanf("%d%d",&l,&r);
q[i] = {l,r,i};
}
sort(q+1,q+1+m);
for(int i=1;i<=n;i++){
int x = f[i];
pre[i] = las[x];
las[x] = i;
}
int l = 1;
for(int i=1;i<=m;i++){
for(;l<=q[i].r;l++){
// if(!pre[l])continue;
add(l,1);
add(pre[l],-1);
}
ans[q[i].times] = sum(q[i].r)-sum(q[i].l-1);
}
for(int i=1;i<=m;i++){
printf("%d\n",ans[i]);
}
return 0;
}