提示是在 query的if (l <= t[u].l && t[u].r <= r)那里越界了
#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e5 + 5;
#define ls u << 1
#define rs u << 1 | 1
struct edge {
int to, next;
} g[maxn << 1];
struct node {
int l, r, val[2];
} t[maxn << 2];
struct ASK {
int x, y, k;
} q[maxn];
int cnt, tot = 0;
int head[maxn], a[maxn], b[maxn], son[maxn], dfn[maxn], fa[maxn], dep[maxn], siz[maxn], f[maxn];
void add(int u, int v) {
g[++tot].to = v;
g[tot].next = head[u];
head[u] = tot;
}
void push_up(int u) {
t[u].val[0] = t[ls].val[0] + t[rs].val[0];
t[u].val[1] = t[ls].val[1] + t[rs].val[1];
}
void build(int u, int l, int r) {
t[u].l = l;
t[u].r = r;
if (l == r) {
t[u].val[0] = b[l] > 0 ? 1 : 0;
t[u].val[1] = b[l] < 0 ? -1 : 0;
return;
}
int mid = (l + r) >> 1;
build(ls, l, mid);
build(rs, mid + 1, r);
push_up(u);
}
int query(int u, int l, int r, int opt) {
if (l <= t[u].l && t[u].r <= r) {
return t[u].val[opt];
} else {
int mid = (t[u].l + t[u].r) >> 1;
int s = 0;
if (l <= mid) {
s += query(ls, l, r, opt);
}
if (r > mid) {
s += query(rs, l, r, opt);
}
return s;
}
}
void dfs1(int u, int father, int depth) {
dep[u] = depth;
fa[u] = father;
siz[u] = 1;
for (int i = head[u]; i; i = g[i].next) {
int v = g[i].to;
if (v == father) {
continue;
}
dfs1(v, u, depth + 1);
siz[u] += siz[v];
if (siz[v] > siz[son[u]]) {
son[u] = v;
}
}
}
void dfs2(int u, int s) {
dfn[u] = ++cnt;
b[cnt] = a[u];
f[u] = s;
if (!son[u]) {
return;
}
dfs2(son[u], s);
for (int i = head[u]; i; i = g[i].next) {
int v = g[i].to;
if (v == fa[u] || v == son[u]) {
continue;
}
dfs2(v, v);
}
}
int ask(int x, int y, int opt) {
int ans = 0;
while (f[x] != f[y]) {
if (dep[f[x]] < dep[f[y]]) {
swap(x, y);
}
ans += query(1, dfn[f[x]], dfn[x], opt);
x = fa[f[x]];
}
if (dep[x] > dep[y]) {
swap(x, y);
}
ans += query(1, dfn[x], dfn[y], opt);
return ans;
}
void init(int n) {
for (int i = 1; i <= n + 2; ++i) {
a[i] = 0;
b[i] = 0;
son[i] = 0;
dfn[i] = 0;
fa[i] = 0;
dep[i] = 0;
siz[i] = 0;
f[i] = 0;
head[i] = 0;
}
tot = 0;
}
void best_coder() {
int T;
cin >> T;
while (T--) {
int n;
cin >> n;
tot = 1;
a[1] = 1;
int num = 1, m = 0;
for (int i = 1; i <= n; ++i) {
char opt;
int x, y;
cin >> opt >> x >> y;
if (opt == '+') {
add(x, ++num);
a[num] = y;
} else {
q[++m].x = x;
q[m].y = y;
cin >> q[m].k;
}
}
dfs1(1, 0, 1);
dfs2(1, 1);
build(1, 1, num);
for (int i = 1; i <= m; ++i) {
int mx = ask(q[i].x, q[i].y, 0);
int mn = ask(q[i].x, q[i].y, 1);
cout << (q[i].k >= mn && q[i].k <= mx ? "YES\n" : "NO\n");
}
init(num);
}
}