显示代码纯文本
- #include <bits/stdc++.h>
- #define pb emplace_back
- #define fir first
- #define sec second
-
- using i64 = long long;
- using tup = std::tuple<int, int, int, int>;
- using pii = std::pair<int, int>;
-
- constexpr int maxn = 1e5 + 5;
- int n, m, a[maxn], dfn[maxn], rev[maxn], dfc, top[maxn], siz[maxn], dep[maxn], fa[maxn], son[maxn], buc[maxn], ans[maxn];
- std::vector<int> G[maxn];
- std::vector<std::tuple<int, int, int, int>> qry;
-
- void dfs1(int u, int ff) {
- siz[u] = 1; dep[u] = dep[fa[u] = ff] + 1;
- for (auto& v : G[u]) {
- if (v == ff) continue ;
- dfs1(v, u); siz[u] += siz[v];
- if (siz[v] > siz[son[u]]) son[u] = v;
- }
- return ;
- }
-
- void dfs2(int u, int tp) {
- top[rev[dfn[u] = ++dfc] = u] = tp;
- if (!son[u]) return ;
- dfs2(son[u], tp);
- for (auto& v : G[u])
- if (v != fa[u] && v != son[u]) dfs2(v, v);
- return ;
- }
-
- void forw(int u, int v, int w, int id) {
- while (top[u] != top[v]) {
- if (dep[top[u]] < dep[top[v]]) std::swap(u, v);
- qry.pb(w, id, dfn[top[u]] - 1, -1);
- qry.pb(w, id, dfn[u], 1);
- u = fa[top[u]];
- }
- if (dep[u] > dep[v]) std::swap(u, v);
- qry.pb(w, id, dfn[u] - 1, -1);
- qry.pb(w, id, dfn[v], 1);
- return ;
- }
-
- int main() {
- freopen("_milkvisits.in", "r", stdin);
- freopen("_milkvisits.out", "w", stdout);
- scanf("%d %d", &n, &m);
- for (int i = 1; i <= n; ++i)
- scanf("%d", &a[i]);
- for (int i = 1; i < n; ++i) {
- int u, v; scanf("%d %d", &u, &v);
- G[u].pb(v); G[v].pb(u);
- }
- dfs1(1, 0); dfs2(1, 0);
- for (int i = 1; i <= m; ++i) {
- int u, v, t; scanf("%d %d %d", &u, &v, &t);
- forw(u, v, t, i);
- }
- int j = 1;
- std::sort(qry.begin(), qry.end(), [&](const tup& lhs, const tup& rhs) {
- return std::get<2>(lhs) < std::get<2>(rhs);
- });
- for (auto& p : qry) {
- int w, id, x, v; std::tie(w, id, x, v) = p;
- for (; j <= x; ++j) ++buc[a[rev[j]]];
- ans[id] += v * buc[w];
- }
- for (int i = 1; i <= m; ++i)
- printf("%d", ans[i] > 0);
- return 0;
- }