Advertisement
fooker

1878G

Mar 17th, 2024
721
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.54 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define ll long long
  4.  
  5. const ll nmax2 = 1e9+7;
  6. const ll nmax = 998244353;
  7.  
  8. #include <ext/pb_ds/assoc_container.hpp>
  9. #include <ext/pb_ds/tree_policy.hpp>
  10. #include <ext/pb_ds/detail/standard_policies.hpp>
  11. using namespace __gnu_pbds;
  12. typedef tree<ll, null_type, less<ll>, rb_tree_tag, tree_order_statistics_node_update> ordered_set;
  13. typedef tree<std::pair<ll, ll>, null_type, less<std::pair<ll,ll>>, rb_tree_tag, tree_order_statistics_node_update> ordered_set_pair;
  14.  
  15. ll get_set_bits(ll u){
  16.     return __builtin_popcount(u);
  17. }
  18.  
  19. void solve(){
  20.     ll n;
  21.     std::cin >> n;
  22.  
  23.     std::vector<ll> a(n + 1);
  24.     for (ll i = 1; i <= n; i++) std::cin >> a[i];
  25.  
  26.     std::vector<std::vector<ll>> adj(n + 1, std::vector<ll>());
  27.  
  28.     for (ll i = 1, x, y; i < n; i++){
  29.         std::cin >> x >> y;
  30.         adj[x].push_back(y);
  31.         adj[y].push_back(x);
  32.     }
  33.  
  34.     ll timer = 1;
  35.     std::vector<ll> tin(n + 1);
  36.     std::vector<ll> tout(n + 1);
  37.     std::vector<ll> dist(n + 1);
  38.  
  39.     ll next[n + 1][31];
  40.     for (ll i = 0; i <= n; i++){
  41.         for (ll j = 0; j <= 30; j++) next[i][j] = -1;
  42.     }
  43.  
  44.     std::function<bool(ll, ll)> is_ancestor = [&] (ll u, ll v){
  45.         if (u == -1 or v == -1) return false;
  46.         return ((tin[u] <= tin[v]) && (tout[u] >= tout[v]));
  47.     }; 
  48.  
  49.     std::vector<ll> b(n + 1, -1);
  50.  
  51.     ll lca[n + 1][21];
  52.     ll or_calc[n + 1][21];
  53.     for (ll i = 0; i <= n; i++){
  54.         for (ll j = 0; j <= 20; j++){
  55.             lca[i][j] = -1;
  56.             or_calc[i][j] = 0;
  57.         }
  58.     }
  59.  
  60.     std::function<ll(ll, ll)> get_lca = [&] (ll u, ll v){
  61.         if (is_ancestor(u, v)){
  62.             return u;
  63.         }
  64.         if (is_ancestor(v, u)){
  65.             return v;
  66.         }
  67.         for (ll i = 20; i >= 0; i--){
  68.             if (lca[u][i] == -1) continue;
  69.             if (!is_ancestor(lca[u][i], v)){
  70.                 u = lca[u][i];
  71.             }
  72.         }
  73.         return lca[u][0];
  74.     };
  75.  
  76.     std::function<void(ll, ll)> dfs = [&] (ll u, ll p) {
  77.         tin[u] = timer++;
  78.         for (ll i = 30; i >= 0; i--){
  79.             if ((a[u] >> i) & 1){
  80.                 b[i] = u;
  81.             }
  82.             next[u][i] = b[i];
  83.         }
  84.  
  85.         lca[u][0] = p;
  86.         or_calc[u][0] = a[u];
  87.         if (p != -1) or_calc[u][0] |= a[p];
  88.  
  89.         for (ll i = 1; i <= 20; i++){
  90.             if (lca[u][i - 1] != -1){
  91.                 lca[u][i] = lca[lca[u][i - 1]][i - 1];
  92.                 or_calc[u][i] = or_calc[u][i - 1] | or_calc[lca[u][i - 1]][i - 1];
  93.             } else{
  94.                 or_calc[u][i] = or_calc[u][i - 1];
  95.             }
  96.         }
  97.  
  98.         for (auto v: adj[u]){
  99.             if (v == p) continue;
  100.             dist[v] = dist[u] + 1;
  101.             dfs(v, u);
  102.         }
  103.  
  104.         tout[u] = timer++;
  105.     };
  106.     dfs(1, -1);
  107.  
  108.     std::function<ll(ll, ll)> calc_or = [&] (ll u, ll v){
  109.         ll ans = 0;
  110.         for (ll i = 20; i >= 0; i--){
  111.             if (lca[u][i] == -1) continue;
  112.             if (is_ancestor(v, lca[u][i])){
  113.                 ans |= or_calc[u][i];
  114.                 u = lca[u][i];
  115.             }
  116.         }
  117.         return ans;
  118.     };
  119.  
  120.     std::function<ll(ll, ll)> _path_or = [&] (ll u, ll v){
  121.         ll l = get_lca(u, v);
  122.         ll res = calc_or(u, l) | calc_or(v, l);
  123.         return res;
  124.     };
  125.  
  126.     ll q;
  127.     std::cin >> q;
  128.  
  129.     for (ll i = 1, x, y; i <= q; i++){
  130.         std::cin >> x >> y;
  131.  
  132.         std::vector<ll> temp;
  133.  
  134.         ll fin = 0;
  135.         ll l = get_lca(x, y);
  136.         for (ll j = 0; j <= 30; j++){
  137.             if (next[x][j] != -1 and is_ancestor(l, next[x][j])){
  138.                 temp.push_back(next[x][j]);
  139.             }
  140.             if (next[y][j] != -1 and is_ancestor(l, next[y][j])){
  141.                 temp.push_back(next[y][j]);
  142.             }
  143.         }
  144.        
  145.         for (auto w: temp){
  146.             fin = std::max(fin, 1LL * get_set_bits(_path_or(x, w)) + 1LL * get_set_bits(_path_or(w, y)));
  147.         }
  148.  
  149.         std::cout << fin << " \n"[i == q];
  150.     }  
  151.  
  152. }  
  153.  
  154. int main(){
  155.     std::ios_base::sync_with_stdio(false);
  156.     std::cin.tie(0);
  157.     std::cout.tie(0);
  158.  
  159.     int t;
  160.     std::cin >> t;
  161.     // t = 1;
  162.     while(t--){
  163.         solve();
  164.     }
  165.     return 0;
  166. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement