Advertisement
Guest User

Untitled

a guest
Sep 21st, 2021
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.48 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define int long long int
  3. #define double long double
  4. #define endl '\n'
  5. #define all(c) c.begin(),c.end()
  6. #define mp(x,y) make_pair(x,y)
  7. #define eb emplace_back
  8. #define tr(k,st,en) for(int k = st; k <= en ; k++)
  9. #define trb(k,en,st) for(int k = en; k >= st ; k--)
  10. #define test int TN; cin>>TN; tr(T,1,TN)
  11. #define mxe(c) max_element(all(c))
  12. #define mne(c) min_element(all(c))
  13. using namespace std;
  14.  
  15. template<typename A, typename B> ostream& operator<<(ostream &os, const pair<A, B> &p) { return os << '(' << p.first << ", " << p.second << ')'; }
  16. template < typename T_container, typename T = typename enable_if < !is_same<T_container, string>::value, typename T_container::value_type >::type > ostream & operator<<(ostream &os, const T_container &v) { os << '{'; string sep; for (const T &x : v) os << sep << x, sep = ", "; return os << '}'; }
  17.  
  18. void dbg_out() { cerr << endl; }
  19. template<typename Head, typename... Tail> void dbg_out(Head H, Tail... T) { cerr << ' ' << H; dbg_out(T...); }
  20.  
  21. #ifdef LOCAL
  22. #define dbg(...) cerr << "(" << #__VA_ARGS__ << "):", dbg_out(__VA_ARGS__)
  23. #else
  24. #define dbg(...)
  25. #endif
  26.  
  27. typedef pair<int, int> pr;
  28. typedef vector<int> vi;
  29. typedef vector<vi> vvi;
  30. typedef vector<pr> vpr;
  31.  
  32. //const int mod = 1e9+7;
  33. //const int inf = 9e18;
  34.  
  35. const int N = 200005;
  36. vector<int> adj[N];
  37.  
  38. int par[N];
  39.  
  40. void dfs(int x, int p) {
  41.     par[x] = p;
  42.     for (int l : adj[x]) {
  43.         if (l != p) dfs(l, x);
  44.     }
  45. }
  46.  
  47. int tme = 0;
  48. int tin[N], tout[N], val[N] , t_val[N];
  49.  
  50. void dfs2(int x, int p, int cur) {
  51.     tin[x] = tme++;
  52.     t_val[tin[x]] = cur;
  53.     for (int l : adj[x]) {
  54.         if (l != p) {
  55.             dfs2(l, x, cur ^ val[l]);
  56.         }
  57.     }
  58.     tout[x] = tme;
  59. }
  60.  
  61. int get_sqrt(int x) {
  62.     int l = 1, r = x;
  63.     while (l + 1 < r) {
  64.         int m = (l + r) / 2;
  65.         if (m * m <= x) {
  66.             l = m;
  67.         } else r = m;
  68.     }
  69.     return r;
  70. }
  71.  
  72. class SqrtDecom {
  73. public:
  74.     vector<int> arr;
  75.     vector<unordered_map<int, int>> block;
  76.     vector<int> lz;
  77.     int sz;
  78.     int b_sz;
  79.     SqrtDecom(int * in, int n) {
  80.         arr.resize(n);
  81.         sz = arr.size();
  82.         b_sz = get_sqrt(sz);
  83.         block.resize(b_sz);
  84.         lz.assign(b_sz, 0);
  85.         for (int i = 0; i < n; i++) {
  86.             block[i / b_sz][in[i]]++;
  87.             arr[i] = in[i];
  88.         }
  89.     }
  90.     int query(int x) {
  91.         int rt = 0;
  92.         for (int i = 0; i < b_sz; i++) {
  93.             int tp = lz[i] ^ x;
  94.             rt += block[i][tp];
  95.         }
  96.         return rt;
  97.     }
  98.     void update(int l, int r, int v) {
  99.         int c_l = l / b_sz,   c_r = r / b_sz;
  100.         if (c_l == c_r)
  101.             for (int i = l; i <= r; ++i) {
  102.                 block[c_l][arr[i]]--;
  103.                 arr[i] = arr[i] ^ v;
  104.                 block[c_l][arr[i]]++;
  105.             }
  106.         else {
  107.             for (int i = l, end = (c_l + 1) * b_sz - 1; i <= end; ++i) {
  108.                 block[c_l][arr[i]]--;
  109.                 arr[i] = arr[i] ^ v;
  110.                 block[c_l][arr[i]]++;
  111.             }
  112.             for (int i = c_l + 1; i <= c_r - 1; ++i)
  113.                 lz[i] = lz[i] ^ v;
  114.             for (int i = c_r * b_sz; i <= r; ++i) {
  115.                 block[c_r][arr[i]]--;
  116.                 arr[i] = arr[i] ^ v;
  117.                 block[c_r][arr[i]]++;
  118.             }
  119.         }
  120.     }
  121.     int get_val(int idx) {
  122.         int p = lz[idx / b_sz];
  123.         return arr[idx] ^ p;
  124.     }
  125. };
  126.  
  127.  
  128.  
  129. int32_t main() {
  130.     std::ios::sync_with_stdio(false);
  131.     cin.tie(NULL); cout.tie(NULL);
  132.  
  133.     int n, q;
  134.     cin >> n >> q;
  135.     vector<vector<int>> tmp;
  136.     for (int i = 1; i < n; i++) {
  137.         int u, v, w;
  138.         cin >> u >> v >> w;
  139.         tmp.emplace_back( vector<int>({u, v, w}));
  140.         adj[u].push_back(v);
  141.         adj[v].push_back(u);
  142.     }
  143.     dfs(1, 0);
  144.     for (auto m : tmp) {
  145.         int u = m[0], v = m[1], w = m[2];
  146.         if (u != par[v]) {
  147.             swap(u, v);
  148.         }
  149.         val[v] = w;
  150.     }
  151.     dfs2(1, 0, 0);
  152.     SqrtDecom str(t_val, tme);
  153.     for (int i = 0; i < q; i++) {
  154.         int t;
  155.         cin >> t;
  156.         if (t == 1) {
  157.             int x;
  158.             cin >> x;
  159.             int p = str.get_val(tin[x]);
  160.             cout << str.query(p) << endl;
  161.         } else {
  162.             int u, v, w;
  163.             cin >> u >> v >> w;
  164.             if (u != par[v]) {
  165.                 swap(u, v);
  166.             }
  167.             str.update(tin[v], tout[v] - 1, val[v] ^ w);
  168.             val[v] = w;
  169.         }
  170.     }
  171.     return 0;
  172. }
  173.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement