1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
| void solve() { int _; cin >> _; for (int ts = 0; ts < _; ++ts) { int n, q; cin >> n >> q; struct node { int v, n; }; vector<node> edge(n * 2 - 2); vector<int> head(n + 1, -1), pos(n + 1);; vector<vector<tuple<int, int, int>>> query(n + 1); vector<pair<int, int>> qs; for (int i = 0; i < n - 1; ++i) { int u, v; cin >> u >> v; edge[i << 1] = {v, head[u]}; edge[i << 1 | 1] = {u, head[v]}; head[u] = i << 1; head[v] = i << 1 | 1; } for (int i = 1; i <= n; ++i) { int tmp; cin >> tmp; pos[tmp] = i; } for (int i = 0; i < q; ++i) { int l, r, x; cin >> l >> r >> x; qs.emplace_back(l, r); query[x].emplace_back(l, r, i); } vector<set<int>> tree(n * 2 + 10); auto get = [](const int l, const int r) { return (l + r) | (l != r); }; function<void(int, int, int, int, int)> _add = [&](const int l, const int r, const int x, const int y, const int v) { const int mid = l + r >> 1; if (x == l && y == r) { tree[get(l, r)].insert(v); return; } if (y <= mid) _add(l, mid, x, y, v); else if (x > mid) _add(mid + 1, r, x, y, v); else { _add(l, mid, x, mid, v); _add(mid + 1, r, mid + 1, y, v); } }; function<bool(int, int, int, int, int)> _del = [&](const int l, const int r, const int x, const int y, const int v) { const int mid = l + r >> 1; if (x == l && y == r) { return tree[get(l, r)].erase(v) ? true : false; } if (y <= mid) return _del(l, mid, x, y, v); if (x > mid) return _del(mid + 1, r, x, y, v); return _del(l, mid, x, mid, v) && _del(mid + 1, r, mid + 1, y, v); }; function<void(int, int, int, vector<int>&)> _find = [&](const int l, const int r, const int v, vector<int>& res) { for (const auto& i: tree[get(l, r)]) res.push_back(i); if (l == r) return; if (const int mid = l + r >> 1; v <= mid) { _find(l, mid, v, res); } else if (v > mid) { _find(mid + 1, r, v, res); } }; vector ans(q, false); vector<int> res; res.reserve(n); function<void(int, int)> dfs = [&](const int u, const int p) { for (const auto [l, r, i]: query[u]) _add(1, n, l, r, i); _find(1, n, pos[u], res); for (const auto& i: res) { ans[i] = true; _del(1, n, qs[i].first, qs[i].second, i); } res.clear(); for (int i = head[u]; ~i; i = edge[i].n) { if (edge[i].v == p) continue; dfs(edge[i].v, u); } for (const auto [l, r, i]: query[u]) if (_del(1, n, l, r, i)) ans[i] = false; }; dfs(1, 0); for (const auto& i: ans) cout << (i ? "YES" : "NO") << endl; cout << endl; } }
|