不能用分块。
1 #include <bits/stdc++.h> 2 using namespace std; 3 const int Maxn=1000100; 4 struct Info{int l,r,Id;}Q[Maxn]; 5 int a[Maxn],n,c,m,Last[Maxn],Next[Maxn],d[Maxn],Ans[Maxn]; 6 inline bool Cmp(Info A,Info B) {return A.l>B.l;} 7 inline int Lowbit(int x) {return x&(-x);} 8 inline void Add(int x,int v) {for (int i=x;i<=n;i+=Lowbit(i)) d[i]+=v;} 9 inline int Query(int x) {int Ret=0; for (int i=x;i;i-=Lowbit(i)) Ret+=d[i];return Ret;} 10 int main() 11 { 12 // freopen("c.in","r",stdin); 13 scanf("%d%d%d",&n,&c,&m); 14 for (int i=1;i<=n;i++) scanf("%d",&a[i]); 15 for (int i=1;i<=c;i++) Last[i]=n+1; 16 for (int i=n;i>=1;i--) 17 { 18 Next[i]=Last[a[i]]; 19 Last[a[i]]=i; 20 } 21 Next[n+1]=n+1; 22 for (int i=1;i<=m;i++) scanf("%d%d",&Q[i].l,&Q[i].r),Q[i].Id=i; 23 sort(Q+1,Q+m+1,Cmp); int j=n; 24 for (int i=1;i<=m;i++) 25 { 26 while (j && j>=Q[i].l) Add(Next[Next[j]],-1),Add(Next[j--],1); 27 Ans[Q[i].Id]=Query(Q[i].r); 28 } 29 for (int i=1;i<=m;i++) printf("%d\n",Ans[i]); 30 return 0; 31 }