#include <bits/stdc++.h>
using namespace std;
#define printif(cond) if (cond) { \
puts ("YES"); \
} else { \
puts ("NO"); \
}
#define debug(...) fprintf (stderr, __VA_ARGS__)
#define output(ans) debug ("%d %d %d %d %d %d %d\n", ans.sum, ans.pmx, ans.pmn, ans.smx, ans.smn, ans.tmx, ans.tmn)
const int N = 200010, LOGN = 30, LOGn = 18;
int T, n, m, q, a[N], _u[N], _v[N], _k[N], fa[N][LOGN], dep[N];
struct _data {
int sum, pmx, pmn, smx, smn, tmx, tmn;
} dp[N][LOGN];
_data merge (_data a, _data b) {
_data ans;
ans.sum = a.sum + b.sum;
ans.pmx = max (a.pmx, a.sum + b.pmx);
ans.pmn = min (a.pmn, a.sum + b.pmn);
ans.smx = max (b.smx, b.sum + a.smx);
ans.smn = min (b.smn, b.sum + a.smn);
ans.tmx = max (a.smx + b.pmx, max (a.tmx, b.tmx));
ans.tmn = min (a.smn + b.pmn, min (a.tmn, b.tmn));
return ans;
}
int main () {
scanf ("%d", &T);
while (T --> 0) {
scanf ("%d", &m);
n = 1;
q = 0;
dp[1][0].sum = dp[1][0].pmx = dp[1][0].smx = dp[1][0].tmx = 1;
for (int i = 1; i <= m; i++) {
char op[5];
scanf ("%s", op);
if (op[0] == '+') {
n++;
scanf ("%d%d", &fa[n][0], &a[n]);
dp[n][0].sum = a[n];
if (a[n] == 1) {
dp[n][0].pmx = dp[n][0].smx = dp[n][0].tmx = 1;
dp[n][0].pmn = dp[n][0].smn = dp[n][0].tmn = 0;
} else {
dp[n][0].pmn = dp[n][0].smn = dp[n][0].tmn = -1;
dp[n][0].pmx = dp[n][0].smx = dp[n][0].tmx = 0;
}
dep[n] = dep[fa[n][0]] + 1;
} else {
q++;
scanf ("%d%d%d", &_u[q], &_v[q], &_k[q]);
}
}
for (int j = 1; j <= LOGn; j++) {
for (int i = 1; i <= n; i++) {
fa[i][j] = fa[fa[i][j - 1]][j - 1];
dp[i][j] = merge (dp[i][j - 1], dp[fa[i][j - 1]][j - 1]);
}
}
for (int i = 1; i <= q; i++) {
int u = _u[i], v = _v[i];
if (dep[u] < dep[v]) {
swap (u, v);
}
_data l = {0, 0, 0, 0, 0, 0, 0}, r = {0, 0, 0, 0, 0, 0, 0}, ans;
for (int j = LOGn; j >= 0; j--) {
if (fa[u][j] != 0 && dep[fa[u][j]] >= dep[v]) {
l = merge (l, dp[u][j]);
u = fa[u][j];
}
}
if (u == v) {
ans = merge (l, dp[u][0]);
} else {
for (int j = LOGn; j >= 0; j--) {
if (fa[u][j] != 0 && fa[v][j] != 0 && fa[u][j] != fa[v][j]) {
l = merge (l, dp[u][j]);
r = merge (dp[v][j], r);
u = fa[u][j];
v = fa[v][j];
}
}
// output (l);
// output (dp[u][1]);
// output (dp[v][0]);
// output (merge (l, dp[u][1]));
// output (merge (merge (l, dp[u][1]), dp[v][0]));
ans = merge (merge (merge (l, dp[u][1]), dp[v][0]), r);
}
// output (ans);
printif (_k[i] >= 0 && _k[i] <= ans.tmx || _k[i] < 0 && _k[i] >= ans.tmn);
}
}
return 0;
}
wrong answer expected YES, found NO [13111th token]
因为 #1#2#3#4 都错过所以疯了,求助!