Advertisement
welleyth

Regional 2022 Day1 E. Tree

Feb 5th, 2022
928
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.26 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #include <ext/pb_ds/assoc_container.hpp>
  3. #include <ext/pb_ds/tree_policy.hpp>
  4.  
  5. #define int long long
  6. #define pb push_back
  7. #define mp make_pair
  8.  
  9. #pragma GCC optimize("Ofast")
  10. #pragma GCC optimize("unroll-loops")
  11.  
  12. using namespace std;
  13. using namespace __gnu_pbds;
  14.  
  15. const int N = (int)5e4 + 111;
  16. const int INF = (int)1e18;
  17. const int md = (int)1e9 + 7;
  18.  
  19. vector<int> g[N];
  20. int a[N];
  21. int basis[N][21];
  22. int pr[N];
  23. int sz[N];
  24.  
  25. void add(int v,int x){
  26.     if(x == 0)
  27.         return;
  28.     for(int i = 19; i >= 0; i--)
  29.         x = min(x,basis[v][i]^x);
  30.     for(int i = 19; i >= 0; i--){
  31.         if((x&(1ll<<i)) == 0){
  32.             basis[v][i] = min(basis[v][i],x^basis[v][i]);
  33.             continue;
  34.         }
  35.         if(basis[v][i] == 0){
  36.             basis[v][i] = x;
  37.             sz[v]++;
  38.             return;
  39.         }
  40.         x = basis[v][i]^x;
  41.     }
  42.     return;
  43. }
  44. void recalc(int v){
  45.     for(int i = 0; i <= 19; i++)
  46.         basis[v][i] = 0;
  47.     sz[v] = 0;
  48.     for(auto& x : g[v]){
  49.         if(x == pr[v])
  50.             continue;
  51.         for(int i = 0; i <= 19; i++)
  52.             add(v,basis[x][i]);
  53.     }
  54.     return;
  55. }
  56. void recalcALL(int v){
  57.     while(v > 0){
  58.         recalc(v);
  59.         add(v,a[v]);
  60.         v = pr[v];
  61.     }
  62.     return;
  63. }
  64. bool canBeRepresented(int v,int x){
  65.     for(int i = 19; i >= 0; i--)
  66.         x = min(x,x^basis[v][i]);
  67.     return x == 0;
  68. }
  69. int getKth(int v,int k){
  70.     if(k > (1ll << sz[v]))
  71.         return -1;
  72.     int ans = 0;
  73.     k--;
  74.     int cur = sz[v];
  75.     for(int i = 19; i >= 0; i--){
  76.         if(basis[v][i] == 0)
  77.             continue;
  78.         cur--;
  79.         if(k >= (1ll << cur)){
  80.             k -= (1ll << cur);
  81.             ans ^= basis[v][i];
  82.         }
  83.     }
  84.     return ans;
  85. }
  86. void dfs(int v){
  87.     for(auto& x : g[v]){
  88.         if(x == pr[v])
  89.             continue;
  90.         pr[x] = v;
  91.         dfs(x);
  92.     }
  93.     recalc(v);
  94.     add(v,a[v]);
  95.     return;
  96. }
  97.  
  98. void solve(){
  99.     int n,group;
  100.     cin >> n >> group;
  101.     for(int i = 1; i < n; i++){
  102.         int u,v;
  103.         cin >> u >> v;
  104.         g[u].pb(v);
  105.         g[v].pb(u);
  106.     }
  107.     for(int i = 1; i <= n; i++)
  108.         cin >> a[i];
  109.  
  110.     dfs(1);
  111. //    for(auto& x : basis[1]){
  112. //        cerr << x << " ";
  113. //    }
  114. //    cerr << "\n";
  115. //    for(int i = 0; i < 4; i++)
  116. //        cerr << basis[1][i] << " ";
  117. //    cerr << "\n";
  118. //    cerr << "sz[1] = " << sz[1] << "\n";
  119. //    cerr << getKth(1,11);
  120. //    return;
  121.  
  122.     int q;
  123.     cin >> q;
  124.     while(q--){
  125.         int tp;
  126.         cin >> tp;
  127.         if(tp == 1){ /// UPDATE
  128.             int v,nw;
  129.             cin >> v >> nw;
  130.             a[v] = nw;
  131.             recalcALL(v);
  132.         } else {
  133.             int v,k;
  134.             cin >> v >> k;
  135. //            cerr << "basis[" << v << "] = ";
  136. //            for(auto& x : basis[v]){
  137. //                cerr << x << " ";
  138. //            }
  139. //            cerr << "\n";
  140.             cout << getKth(v,k) << "\n";
  141.         }
  142.     }
  143.  
  144.     return;
  145. }
  146.  
  147. signed main(){
  148.     ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
  149.  
  150.     int tests = 1;
  151. //    cin >> tests;
  152.     for(int test = 1; test <= tests; test++){
  153.         solve();
  154.     }
  155.  
  156.     return 0;
  157. }
  158. /**
  159. 5 0
  160. 1 2
  161. 1 5
  162. 2 3
  163. 2 4
  164. 1 15 7 3
  165. 15
  166.  
  167. 15 = 1111
  168.  
  169. **/
  170.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement