Advertisement
Guest User

Untitled

a guest
Jun 10th, 2021
110
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.50 KB | None | 0 0
  1. // #pragma GCC optimize("Ofast,unroll-loops")
  2. // #pragma GCC target("avx,avx2,fma")
  3.  
  4. #include <bits/stdc++.h>
  5. using namespace std;
  6.  
  7. #define ll long long
  8. #define ull unsigned long long
  9. #define dd double
  10. #define ld long double
  11. #define sl(n) scanf("%lld", &n)
  12. #define si(n) scanf("%d", &n)
  13. #define sd(n) scanf("%lf", &n)
  14. #define pll pair <ll, ll>
  15. #define pii pair <int, int>
  16. #define mp make_pair
  17. #define pb push_back
  18. #define all(v) v.begin(), v.end()
  19. #define inf (1LL << 61)
  20. #define loop(i, start, stop, inc) for(ll i = start; i <= stop; i += inc)
  21. #define for1(i, stop) for(int i = 1; i <= stop; ++i)
  22. #define for0(i, stop) for(int i = 0; i < stop; ++i)
  23. #define rep1(i, start) for(int i = start; i >= 1; --i)
  24. #define rep0(i, start) for(int i = (start-1); i >= 0; --i)
  25. #define ms(n, i) memset(n, i, sizeof(n))
  26. #define casep(n) printf("Case %lld:", ++n)
  27. #define pn printf("\n")
  28. #define pf printf
  29. #define EL '\n'
  30. #define fastio std::ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);
  31.  
  32. // === Debug macro starts here ===
  33. #ifndef ONLINE_JUDGE
  34. #define DEBUG
  35. #define SYS_COL system("COLOR")
  36. #endif
  37.  
  38. int recur_depth = 0;
  39. #ifdef DEBUG
  40. #define dbg(x) {++recur_depth; auto x_=x; --recur_depth; SYS_COL; \
  41.                 cerr<<string(recur_depth, '\t')<<"\e[91m"<<__func__<<":" \
  42.                 <<__LINE__<<"\t"<<#x<<" = "<<x_<<"\e[39m"<<endl;}
  43.  
  44. template<typename Ostream, typename Cont>
  45. typename enable_if<is_same<Ostream,ostream>::value,
  46.             Ostream&>::type operator<<(Ostream& os,  const Cont& v) {
  47.     os<<"[";
  48.     for(auto& x:v){os<<x<<", ";}
  49.     return os<<"]";
  50. }
  51. template<typename Ostream, typename ...Ts>
  52. Ostream& operator<<(Ostream& os,  const pair<Ts...>& p){
  53.     return os<<"{"<<p.first<<", "<<p.second<<"}";
  54. }
  55. #else
  56. #define dbg(x)
  57. #endif
  58. // === Debug macro ends here ===
  59.  
  60. #define ff first
  61. #define ss second
  62.  
  63. const int sz = 1e5 + 10, LN = 18, tsz = 31*sz+10;
  64. int pre[sz], pa[LN][sz], depth[sz], roots[sz], start[sz], idn, tim;
  65.  
  66. struct Edge {
  67.     int v, w;
  68. };
  69. vector <Edge> g[sz];
  70.  
  71. struct NODE
  72. {
  73.     int mx, nxt[2];
  74.     void init()
  75.     {
  76.         nxt[0] = nxt[1] = -1;
  77.     }
  78. } trie[tsz];
  79.  
  80. void Insert(int u, int p, int val)
  81. {
  82.     roots[u] = ++idn;
  83.     trie[ roots[u] ] = trie[ roots[p] ];
  84.     int cur = roots[u];
  85.  
  86.     rep0(i, 30) {
  87.         bool b = (val>>i) & 1;
  88.  
  89.         if(trie[cur].nxt[b] == -1) {
  90.             trie[cur].nxt[b] = ++idn;
  91.             trie[idn].init();
  92.         }
  93.         else {
  94.             int tmp = ++idn;
  95.             trie[tmp] = trie[ trie[cur].nxt[b] ];
  96.             trie[cur].nxt[b] = tmp;
  97.  
  98.         }
  99.         cur = trie[cur].nxt[b];
  100.         trie[cur].mx = start[u];
  101.     }
  102. }
  103.  
  104. /// Finds maximum (X xor K)
  105. int Search(int L, int U, int K)
  106. {
  107.     int ret = 0;
  108.     int cur = roots[U];
  109.  
  110.     rep0(i, 30) {
  111.         bool b = (K>>i) & 1, need = b^1;
  112.  
  113.         if(trie[cur].nxt[need] != -1 && trie[ trie[cur].nxt[need] ].mx >= start[L]) {
  114.             ret = (ret<<1) | 1;
  115.             cur = trie[cur].nxt[need];
  116.         }
  117.         else {
  118.             ret <<= 1;
  119.             cur = trie[cur].nxt[b];
  120.         }
  121.     }
  122.     return ret;
  123. }
  124.  
  125. void dfs(int u, int p, int c, int lev)
  126. {
  127.     pre[u] = c, pa[0][u] = p, depth[u] = lev, start[u] = ++tim;
  128.     Insert(u, p, c);
  129.  
  130.     for(Edge &nd : g[u]) {
  131.         if(nd.v == p)
  132.             continue;
  133.  
  134.         dfs(nd.v, u, c^nd.w, lev+1);
  135.     }
  136. }
  137.  
  138. int LCA(int u, int v)
  139. {
  140.     if(depth[u] < depth[v]) swap(u,v);
  141.     int diff = depth[u] - depth[v];
  142.  
  143.     for(int i = 0; i < LN; i++) if( (diff>>i)&1 ) u = pa[i][u];
  144.     if(u == v) return u;
  145.  
  146.     for(int i = LN-1; i >= 0; i--) {
  147.         if(pa[i][u] != pa[i][v]) {
  148.             u = pa[i][u];
  149.             v = pa[i][v];
  150.         }
  151.     }
  152.  
  153.     return pa[0][u];
  154. }
  155.  
  156. int main()
  157. {
  158.     fastio;
  159.     int t;
  160.     cin >> t;
  161.  
  162.     while(t--) {
  163.         int n, q;
  164.         cin >> n >> q;
  165.  
  166.         for1(i, n-1) {
  167.             int u, v, w;
  168.             cin >> u >> v >> w;
  169.  
  170.             g[u].pb({v, w});
  171.             g[v].pb({u, w});
  172.         }
  173.  
  174.         roots[0] = idn = tim = 0;
  175.         trie[ roots[0] ].init();
  176.         ms(pa, 0);
  177.         dfs(1, 0, 0, 0);
  178.  
  179.         for(int i=1; i<LN; i++)
  180.             for(int j=1; j<=n; j++)
  181.                 if(pa[i-1][j] != 0)
  182.                     pa[i][j] = pa[i-1][pa[i-1][j]];
  183.  
  184.         while(q--) {
  185.             int u, v;
  186.             cin >> u >> v;
  187.  
  188.             int lca = LCA(u, v);
  189.             cout << max(Search(lca, u, pre[u]), Search(lca, v, pre[u])) << EL;
  190.         }
  191.  
  192.         for1(i, n) g[i].clear();
  193.     }
  194.  
  195.     return 0;
  196. }
  197.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement