Advertisement
prog3r

решение A 800ms

Jun 30th, 2025
410
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.35 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define int uint32_t
  4. #pragma GCC optimize("Ofast,unroll-loops")
  5. signed main() {
  6.     ios::sync_with_stdio(0);
  7.     cin.tie(0);
  8.     int n, q;
  9.     cin >> n >> q;
  10.     vector<vector<int>> adj(n);
  11.     for (int i = 0; i < n-1; i += 1) {
  12.         int u, v;
  13.         cin >> u >> v;
  14.         u -= 1, v -= 1;
  15.         adj[u].push_back(v);
  16.         adj[v].push_back(u);
  17.     }
  18.     vector<int> tin1(n), tout1(n), tin2(n), tout2(n);
  19.     int t1 = 0;
  20.     vector<int> d(n);
  21.     auto dfs1 = [&] (auto f, int u, int p) -> void {
  22.         tin1[u] = t1++;
  23.         for (const auto &x : adj[u]) {
  24.             if (x != p) {
  25.                 d[x] = d[u]+1;
  26.                 f(f, x, u);
  27.             }
  28.         }
  29.         tout1[u] = t1-1;
  30.     };
  31.     int t2 = 0;
  32.     auto dfs2 = [&] (auto f, int u, int p) -> void {
  33.         tin2[u] = t2;
  34.         for (const auto &x : adj[u]) {
  35.             if (x != p) {
  36.                 f(f, x, u);
  37.             }
  38.         }
  39.         tout2[u] = t2++;
  40.     };
  41.     dfs1(dfs1, 0, 0);
  42.     dfs2(dfs2, 0, 0);
  43.     struct Node {
  44.         int val=0;
  45.         int lz=0;
  46.     };
  47.     auto push = [&] (int u, int tl, int tr, vector<Node>& ST) -> void {
  48.         int tm = (tl + tr) >> 1;
  49.         int szl = tm-tl+1;
  50.         int szr = tr-(tm+1)+1;
  51.         ST[2*u+1].lz += ST[u].lz;
  52.         ST[2*u+1].val += ST[u].lz*szl;
  53.         ST[2*u+2].lz += ST[u].lz;
  54.         ST[2*u+2].val += ST[u].lz*szr;
  55.         ST[u].lz = 0;
  56.     };
  57.     auto inc = [&] (auto f, int u, int tl, int tr, int l, int r, int x, vector<Node>& ST) -> void {
  58.         if (tl == l && tr == r) {
  59.             ST[u].val += x*(tr-tl+1);
  60.             ST[u].lz += x;
  61.             return;
  62.         }
  63.         int tm = (tl + tr) >> 1;
  64.         push(u, tl, tr, ST);
  65.         if (l <= tm) {
  66.             f(f, 2*u+1, tl, tm, l, min(r, tm), x, ST);
  67.         }
  68.         if (r >= tm+1) {
  69.             f(f, 2*u+2, tm+1, tr, max(tm+1, l), r, x, ST);
  70.         }
  71.         ST[u].val = ST[2*u+1].val + ST[2*u+2].val;
  72.     };
  73.     auto gt = [&] (auto f, int u, int tl, int tr, int l, int r, vector<Node>& ST) -> int {
  74.         if (tl == l && tr == r) {
  75.             return ST[u].val;
  76.         }
  77.         int tm = (tl + tr) >> 1;
  78.         push(u, tl, tr, ST);
  79.         int ret = 0;
  80.         if (l <= tm) {
  81.             ret += f(f, 2*u+1, tl, tm, l, min(r, tm), ST);
  82.         }
  83.         if (r >= tm+1) {
  84.             ret += f(f, 2*u+2, tm+1, tr, max(tm+1, l), r, ST);
  85.         }
  86.         return ret;
  87.     };
  88.     vector<Node> vals(4*n+10), cancelled(4*n+10);
  89.     auto inc_on_path_to_root = [&] (int u, int x) -> void {
  90.         inc(inc, 0, 0, n-1, 0, tout1[u], x, vals);
  91.         if (tout2[u] >= 1) {
  92.             inc(inc, 0, 0, n-1, 0, tout2[u]-1, x, cancelled);
  93.         }
  94.     };
  95.     auto gt_subtree = [&] (int u) -> int {
  96.         return gt(gt, 0, 0, n-1, tin1[u], tout1[u], vals)-gt(gt, 0, 0, n-1, tin2[u], tout2[u], cancelled);
  97.     };
  98.     int ans = 0;
  99.     for (int ii = 0; ii < q; ii += 1) {
  100.         int tp;
  101.         cin >> tp;
  102.         if (tp == 1) {
  103.             int u;
  104.             cin >> u;
  105.             u -= 1;
  106.             inc_on_path_to_root(u, 1);
  107.         }
  108.         if (tp == 2) {
  109.             int u;
  110.             cin >> u;
  111.             u -= 1;
  112.             ans += gt_subtree(u);
  113.         }
  114.         if (ii % 100 == 99) {
  115.             cout << ans << endl;
  116.             ans = 0;
  117.         }
  118.     }
  119. }
  120.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement