tree为什么不用开2倍空间,它不是树状数组吗
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1e6 + 5;
int n, m;
int a[N], ans[N], vis[N], tree[N];
struct ques {
int l, r, id;
} q[N];
bool cmp(ques a, ques b) {
return a.r < b.r;
}
inline int lowbit(int x) {
return x & (-x);
}
void modify(int p, int v) { //单点修改
for (; p <= n; p += lowbit(p))
tree[p] += v;
}
int query(int p) { //查询前缀和
int res = 0;
for (; p; p -= lowbit(p))
res += tree[p];
return res;
}
signed main() {
cin.tie(0); ios::sync_with_stdio(0);
cin >> n;
for (int i = 1; i <= n; i++) cin >> a[i];
cin >> m;
for (int i = 1; i <= m; i++) {
cin >> q[i].l >> q[i].r; q[i].id = i;
}
sort(q + 1, q + 1 + m, cmp);
int pow = 1;
for (int i = 1; i <= m; i++) {
for (int j = pow; j <= q[i].r; j++) {
if (vis[a[j]]) modify(vis[a[j]], -1);
modify(j, 1);
vis[a[j]] = j;
}
pow = q[i].r + 1;
ans[q[i].id] = query(q[i].r) - query(q[i].l - 1);
}
for (int i = 1; i <= m; i++) cout << ans[i] << "\n";
}