RT,不知道为什么TLE
附上代码
#include <bits/stdc++.h>
using namespace std;
#define LL long long
#define R register int
const int N = 2e6 + 10;
struct node {
int l ,r, id, op;
}q[N];
LL Ans[N], a[N], cnt[N], ans = 0;
int n, m, k, size;
bool cmp (register node x,register node y) {
return x.op != y.op ? x.l < y.l : ((x.op & 1) ? x.r < y.r : x.r > y.r);
}
void inline del (int x) {
-- cnt[a[x]];
if(!cnt[a[x]]) -- ans;
}
void inline add (int x) {
if(!cnt[a[x]]) ++ ans;
++ cnt[a[x]];
}
int main () {
scanf("%d", &n);
size = (int) sqrt(n);
if(size * size < n) size ++;
for(R i = 1; i <= n; i ++)
scanf("%lld", &a[i]);
scanf("%d", &m);
for(R i = 1; i <= m; i ++) {
scanf("%d%d", &q[i].l, &q[i].r);
q[i].id = i; q[i].op = ((i - 1) / size + 1);
}
sort(q + 1, q + m + 1, cmp);
int l = 1, r = 0;
for(R i = 1; i <= m; i ++ ){
while (l < q[i].l) del(l ++);
while (l > q[i].l) add(-- l);
while (r < q[i].r) add(++ r);
while (r > q[i].r) del(r --);
Ans[q[i].id] = ans;
}
for(R i = 1; i <= m; i ++)
printf("%lld\n", Ans[i]);
return 0;
}