1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #define M 1000009 5 using namespace std; 6 struct data 7 { 8 int x,y,id; 9 }c[M]; 10 int a[M],n,m,d,ans,kk[M],head[M],next[M],sum[M]; 11 bool cmp(data a1,data a2) 12 { 13 if(a1.x==a2.x) 14 return a1.y<a2.y; 15 return a1.x<a2.x; 16 } 17 void jia(int a1,int a2) 18 { 19 if(!a1) 20 return; 21 for(;a1<=n;a1+=a1&-a1) 22 sum[a1]+=a2; 23 return; 24 } 25 int query(int a1) 26 { 27 int su=0; 28 for(;a1;a1-=a1&-a1) 29 su+=sum[a1]; 30 return su; 31 } 32 int main() 33 { 34 scanf("%d%d%d",&n,&d,&m); 35 for(int i=1;i<=n;i++) 36 scanf("%d",&a[i]); 37 for(int i=n;i;i--) 38 { 39 next[i]=head[a[i]]; 40 head[a[i]]=i; 41 } 42 for(int i=1;i<=d;i++) 43 jia(next[head[i]],1); 44 for(int i=1;i<=m;i++) 45 { 46 scanf("%d%d",&c[i].x,&c[i].y); 47 c[i].id=i; 48 } 49 sort(c+1,c+m+1,cmp); 50 int l=1; 51 for(int i=1;i<=m;i++) 52 { 53 for(;l<c[i].x;l++) 54 { 55 if(next[l]) 56 jia(next[l],-1); 57 jia(next[next[l]],1); 58 } 59 kk[c[i].id]=query(c[i].y); 60 } 61 for(int i=1;i<=m;i++) 62 printf("%d\n",kk[i]); 63 return 0; 64 }
排序后树状数组维护。