救命别人的主席树都相当正常救我的怎么调都是 MLE qwq
#include <iostream>
using namespace std;
const int MAXN = 1e6 + 5;
int n, m, c[MAXN], nxt[MAXN], bucket[MAXN];
namespace LRZorz {
struct node * nil;
struct node {
int l, r, sum;
node * ls, * rs;
node() : l(0), r(0), sum(0), ls(this), rs(this) {}
inline node(int ll, int rr) : l(ll), r(rr), sum(0), ls(nil), rs(nil) {}
} * rt[MAXN];
void add(int idx, int v, node * rt) {
if (rt -> r < idx || idx < rt -> l)
return;
rt -> sum += v;
if (rt -> l == idx && rt -> r == idx)
return;
int l = rt -> l, r = rt -> r, m = (l + r) >> 1;
if (idx <= m)
add(idx, v, rt -> ls = (rt -> ls == nil ? new node(l, m) : new node(*(rt -> ls))));
else
add(idx, v, rt -> rs = (rt -> rs == nil ? new node(m + 1, r) : new node(*(rt -> rs))));
}
int query(int l, int r, node * rt) {
if (rt -> r < l || r < rt -> r)
return 0;
if (l <= rt -> l && rt -> r <= r)
return rt -> sum;
return query(l, r, rt -> ls) + query(l, r, rt -> rs);
}
void build() {
nil = new node;
rt[0] = new node(2, n + 1);
for (int i = 1; i <= n; i ++) {
rt[i] = new node(*(rt[i - 1]));
add(nxt[i], 1, rt[i]);
}
}
inline int query(int l, int r) {
return query(r + 1, n + 1, rt[r]) - query(r + 1, n + 1, rt[l - 1]);
}
}
void init() {
cin >> n;
for (int i = 1; i <= n; i ++)
cin >> c[i];
for (int i = n; i; i --) {
nxt[i] = (bucket[c[i]] == 0 ? n + 1 : bucket[c[i]]);
bucket[c[i]] = i;
}
LRZorz :: build();
}
int main() {
ios :: sync_with_stdio(0);
cin.tie(0); cout.tie(0);
init();
for (cin >> m; m; m --) {
int l, r;
cin >> l >> r;
cout << LRZorz :: query(l, r) << '\n';
}
return 0;
}
感谢(跪