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 }

排序后树状数组维护。

posted on 2016-03-22 06:28  xiyuedong  阅读(165)  评论(0编辑  收藏  举报