SPOJ - DQUERY
代码:
#include <bits/stdc++.h>
using namespace std;
int n, Q, block;
int l = 1, r = 0, res = 0;
int a[30005], vis[1000005], ans[200005];
struct question{
int l, r, id;
bool operator<(const question &Q)const{
return l/block==Q.l/block ? r<Q.r : l/block<Q.l/block;
}
}q[200005];
void add(int x){
if(++vis[a[x]] == 1)++res;
}
void del(int y){
if(--vis[a[y]] == 0)--res;
}
int main(){
scanf("%d", &n);
block = sqrt(n);
for(int i = 1; i <= n; ++i)scanf("%d", &a[i]);
scanf("%d", &Q);
for(int i = 1; i <= Q; ++i)scanf("%d %d", &q[i].l, &q[i].r),q[i].id = i;
sort(q+1, q+Q+1);
for(int i = 1; i <= Q; ++i){
while(r<q[i].r)add(++r);
while(l>q[i].l)add(--l);
while(r>q[i].r)del(r--);
while(l<q[i].l)del(l++);
ans[q[i].id] = res;
}
for(int i = 1; i <= Q; ++i)printf("%d\n", ans[i]);
return 0;
}