Advertisement
prog3r

B (On segment on segment) AC 1265ms

Jul 1st, 2025
390
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.04 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #pragma GCC optimize("Ofast,unroll-loops")
  4. signed main() {
  5.     ios::sync_with_stdio(0);
  6.     cin.tie(0);
  7.     int n, q;
  8.     cin >> n >> q;
  9.     struct Node {
  10.         int val=0;
  11.         int l=-1;
  12.         int r=-1;
  13.         int move_to_y; // -5 means that it is y node already
  14.     };
  15.     vector<Node> nodes;
  16.     nodes.reserve(6e7);
  17.     auto l = [&] (int u) -> int {
  18.         return (u == -1)?-1:nodes[u].l;
  19.     };
  20.     auto r = [&] (int u) -> int {
  21.         return (u == -1)?-1:nodes[u].r;
  22.     };
  23.     auto gtval = [&] (int u) -> int {
  24.         return (u == -1)?0:nodes[u].val;
  25.     };
  26.     auto mky = [&] (int val, int l, int r) -> int {
  27.         nodes.push_back({val, l, r, -5});
  28.         return nodes.size()-1;
  29.     };
  30.     auto mkx = [&] (int val, int l, int r, int move_to_y) -> int {
  31.         nodes.push_back({val, l, r, move_to_y});
  32.         return nodes.size()-1;
  33.     };
  34.     auto move_to_y = [&] (int u) -> int {
  35.         return (u==-1)?-1:nodes[u].move_to_y;
  36.     };
  37.     auto incy = [&] (auto f, int u, int ytl, int ytr, int y, int val) -> int {
  38.         if (ytl == ytr) {
  39.             return mky(gtval(u) + val, -1, -1);
  40.         } else {
  41.             int tm = (ytl + ytr) >> 1;
  42.             if (y <= tm) {
  43.                 int nwl = f(f, l(u), ytl, tm, y, val);
  44.                 return mky(gtval(nwl)+gtval(r(u)), nwl, r(u));
  45.             } else {
  46.                 int nwr = f(f, r(u), tm+1, ytr, y, val);
  47.                 return mky(gtval(l(u))+gtval(nwr), l(u), nwr);
  48.             }
  49.         }
  50.     };
  51.     auto incx = [&] (auto f, int u, int xtl, int xtr, int ytl, int ytr, int x, int y, int val) -> int {
  52.         if (xtl == xtr) {
  53.             int goy = incy(incy, move_to_y(u), ytl, ytr, y, val);
  54.             return mkx(gtval(goy), -1, -1, goy);
  55.         }
  56.         int tm = (xtl + xtr) >> 1;
  57.         int L = l(u), R = r(u);
  58.         if (x <= tm) {
  59.             L = f(f, l(u), xtl, tm, ytl, ytr, x, y, val);
  60.         } else {
  61.             R = f(f, r(u), tm+1, xtr, ytl, ytr, x, y, val);
  62.         }
  63.         int goy = incy(incy, move_to_y(u), ytl, ytr, y, val);
  64.         return mkx(gtval(L)+gtval(R), L, R, goy);
  65.     };
  66.     auto gt_prev_val = [&] (auto f, int u, int xtl, int xtr, int ytl, int ytr, int x) -> int {
  67.         if (xtl == xtr) {
  68.             if (nodes[u].move_to_y != -5) {
  69.                 u = nodes[u].move_to_y;
  70.             }
  71.             if (ytl == ytr) {
  72.                 return ytl;
  73.             } else {
  74.                 int tm = (ytl + ytr) >> 1;
  75.                 if (gtval(l(u))) {
  76.                     return f(f, l(u), xtl, xtr, ytl, tm, x);
  77.                 }
  78.                 return f(f, r(u), xtl, xtr, tm+1, ytr, x);
  79.             }
  80.         } else {
  81.             int tm = (xtl + xtr) >> 1;
  82.             if (x <= tm) {
  83.                 return f(f, l(u), xtl, tm, ytl, ytr, x);
  84.             } else {
  85.                 return f(f, r(u), tm+1, xtr, ytl, ytr, x);
  86.             }
  87.         }
  88.     };
  89.     auto gt = [&] (auto f, int u, int xtl, int xtr, int ytl, int ytr, int xl, int xr, int yl, int yr) -> int {
  90.         if (u == -1) {
  91.             return 0ll;
  92.         }
  93.         if (xtl == xl && xtr == xr) {
  94.             if (nodes[u].move_to_y != -5) {
  95.                 u = nodes[u].move_to_y;
  96.             }
  97.             if (ytl == yl && ytr == yr) {
  98.                 return gtval(u);
  99.             } else {
  100.                 int tm = (ytl + ytr) >> 1;
  101.                 int ret = 0;
  102.                 if (yl <= tm) {
  103.                     ret += f(f, l(u), xtl, xtr, ytl, tm, xl, xr, yl, min(yr, tm));
  104.                 }
  105.                 if (yr >= tm+1) {
  106.                     ret += f(f, r(u), xtl, xtr, tm+1, ytr, xl, xr, max(yl, tm+1), yr);
  107.                 }
  108.                 return ret;
  109.             }
  110.         } else {
  111.             int tm = (xtl + xtr) >> 1;
  112.             int ret = 0;
  113.             if (xl <= tm) {
  114.                 ret += f(f, l(u), xtl, tm, ytl, ytr, xl, min(xr, tm), yl, yr);
  115.             }
  116.             if (xr >= tm+1) {
  117.                 ret += f(f, r(u), tm+1, xtr, ytl, ytr, max(xl, tm+1), xr, yl, yr);
  118.             }
  119.             return ret;
  120.         }
  121.     };
  122.     vector<int> roots(q+1, -1);
  123.     for (int i = 1; i <= n; i += 1) {
  124.         roots[0] = incx(incx, roots[0], 1, n, 0, min(n, 100), i, i%(min(n, 100)+1), 1);
  125.     }
  126.     for (int i = 1; i <= q; i += 1) {
  127.         int tp, from;
  128.         cin >> tp >> from;
  129.         roots[i] = roots[from];
  130.         if (tp == 1) {
  131.             int idx, val;
  132.             cin >> idx >> val;
  133.             int prev_val = gt_prev_val(gt_prev_val, roots[i], 1, n, 0, min(n, 100), idx);
  134.             roots[i] = incx(incx, roots[i], 1, n, 0, min(n, 100), idx, prev_val, -1);
  135.             roots[i] = incx(incx, roots[i], 1, n, 0, min(n, 100), idx, val, 1);
  136.         }
  137.         if (tp == 2) {
  138.             int iL, iR, valL, valR;
  139.             cin >> iL >> iR >> valL >> valR;
  140.             int ans = gt(gt, roots[i], 1, n, 0, min(n, 100), iL, iR, valL, valR);
  141.             cout << ans << "\n";
  142.         }
  143.         if (i == q || i % 100 == 0) {
  144.             cout.flush();
  145.         }
  146.     }
  147. }
  148.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement