Advertisement
ThegeekKnight16

The Cave

Aug 2nd, 2023
1,369
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.88 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. const int MAXN = 3e5 + 10;
  4. const int LOG = 30;
  5. vector<vector<int>> grafo;
  6. array<array<int, LOG>, MAXN> dp;
  7. array<int, MAXN> Prof;
  8.  
  9. void dfs(int v, int p)
  10. {
  11.     Prof[v] = Prof[p] + 1;
  12.     dp[v][0] = p;
  13.     for (int k = 1; k < LOG; k++) dp[v][k] = dp[dp[v][k-1]][k-1];
  14.  
  15.     for (auto viz : grafo[v])
  16.     {
  17.         if (viz == p) continue;
  18.         dfs(viz, v);
  19.     }
  20. }
  21.  
  22. int lca(int a, int b)
  23. {
  24.     if (Prof[a] < Prof[b]) swap(a, b);
  25.     int jump = Prof[a] - Prof[b];
  26.     for (int k = 0; k < LOG; k++)
  27.         if (jump & (1 << k)) a = dp[a][k];
  28.     if (a == b) return a;
  29.     for (int k = LOG-1; k >= 0; k--)
  30.         if (dp[a][k] != dp[b][k])
  31.             a = dp[a][k], b = dp[b][k];
  32.     return dp[a][0];
  33. }
  34.  
  35. void solve()
  36. {
  37.     grafo.clear();
  38.     int N, M;
  39.     cin >> N >> M;
  40.     grafo.resize(N+1);
  41.     for (int i = 1; i < N; i++)
  42.     {
  43.         int X, Y;
  44.         cin >> X >> Y;
  45.         grafo[X].push_back(Y);
  46.         grafo[Y].push_back(X);
  47.     }
  48.     Prof[1] = -1;
  49.     dfs(1, 1);
  50.     int atual = 1;
  51.     vector<tuple<int, int, int> > sites(M+1);
  52.     for (int i = 1; i <= M; i++)
  53.     {
  54.         int X, Y, D;
  55.         cin >> X >> Y >> D;
  56.         sites[i] = {X, Y, D};
  57.         int L = lca(X, Y);
  58.         D -= Prof[X] + Prof[Y] - 2*Prof[L];
  59.         if (D < 0) {atual = -1; break;}
  60.         D /= 2;
  61.         for (int k = 0; k < LOG; k++)
  62.             if (D & (1 << k)) L = dp[L][k];
  63.         if (Prof[L] > Prof[atual]) atual = L;
  64.     }
  65.     if (atual == -1) {cout << "NIE" << '\n'; return;}
  66.     Prof[atual] = -1;
  67.     dfs(atual, atual);
  68.     for (int i = 1; i <= M; i++)
  69.     {
  70.         auto [X, Y, D] = sites[i];
  71.         if (Prof[X] + Prof[Y] > D) {cout << "NIE" << '\n'; return;}
  72.     }
  73.     cout << "TAK " << atual << '\n';
  74. }
  75.  
  76. int main()
  77. {
  78.     cin.tie(0)->sync_with_stdio(0);
  79.     int T;
  80.     cin >> T;
  81.     while (T--) solve();
  82. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement