很多人好像都用莫队卡过了,求助
#include <bits/stdc++.h>
#define int long long
using namespace std;
int n, m;
const int maxn = 2e6;
struct Node { int block, l, r, id; } q[maxn];
int a[maxn], cnt[maxn], answer[maxn];
int ans;
inline int read(){
int x = 0, f = 1;
char ch = getchar();
while (! isdigit(ch)) {if (ch == '-') f = -1; ch = getchar();}
while (isdigit(ch)){x = x * 10 + ch - 48; ch = getchar();}
return x * f;
}
inline void write(int x) {
if(x > 9) write(x / 10);
putchar(x % 10 + '0');
}
inline bool cmp(Node x, Node y) {
if (x.block != y.block) return x.block < y.block;
if (x.block & 1) return x.r < y.r;
else return x.r > y.r;
}
inline void Delete(int x) {
cnt[a[x]] --;
if (cnt[a[x]] == 0) ans --;
}
inline void Add(int x) {
cnt[a[x]] ++;
if (cnt[a[x]] == 1) ans ++;
}
signed main() {
n = read();
for (int i = 1; i <= n; i ++) a[i] = read();
m = read();
int block = sqrt(n) + 900;
for (int i = 1; i <= m; i ++) {
q[i].l = read(), q[i].r = read();
q[i].id = i;
q[i].block = (q[i].l - 1) / block + 1;
}
sort(q + 1, q + m + 1, cmp);
int l = 0, r = 0;
int L, R;
for (int i = 1; i <= m; i ++) {
L = q[i].l;
R = q[i].r;
while (r > R) Delete(r --);
while (r < R) Add(++ r);
while (l < L) Delete(l ++);
while (l > L) Add(-- l);
answer[q[i].id] = ans;
}
for (int i = 1; i <= m; i ++) {
write(answer[i]);
printf("\n");
}
}