[bzoj2743]采花
http://blog.csdn.net/jiangshibiao/article/details/23743939 诡异的解法。。
写莫队的话迟早要完。。

1 #include <iostream> 2 #include <algorithm> 3 #include <cstring> 4 #include <cstdlib> 5 #include <map> 6 #include <string> 7 #include <vector> 8 #include <stack> 9 #include <cmath> 10 #include <queue> 11 #include <cstdio> 12 #include <set> 13 using namespace std; 14 15 const int N=1000010; 16 17 int n,c,m,a[N],lst[N],pre[N],tot=1; 18 void add(int i,int c){for(;i;i-=i&-i)a[i]+=c;} 19 void ask(int i,int &c){for(c=0;i<=n;i+=i&-i)c+=a[i];} 20 struct ASD{ 21 int l,r,ans,id; 22 bool operator < (ASD b) const{return r<b.r||(r==b.r&&l<b.l);} 23 }rd[N]; 24 bool cmp(ASD a,ASD b){return a.id<b.id;} 25 int main(){ 26 scanf("%d%d%d",&n,&c,&m); 27 for(int i=1,t;i<=n;i++)scanf("%d",&t),pre[i]=lst[t],lst[t]=i; 28 for(int i=1;i<=m;i++)scanf("%d%d",&rd[i].l,&rd[i].r),rd[i].id=i; 29 sort(rd+1,rd+1+m); 30 for(int i=1;i<=n;i++){ 31 add(pre[pre[i]],-1),add(pre[i],1); 32 while(rd[tot].r==i)ask(rd[tot].l,rd[tot].ans),tot++; 33 } 34 sort(rd+1,rd+1+m,cmp); 35 for(int i=1;i<=m;i++)printf("%d\n",rd[i].ans); 36 }