Advertisement
MaxObznyi

SegTree + struct + combine

Jun 18th, 2022
685
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.87 KB | None | 0 0
  1. #include <iostream>
  2. #include <algorithm>
  3. #define int long long
  4. using namespace std;
  5.  
  6. const int N = 2e5 + 5;
  7.  
  8. struct SegTreeNode {
  9.     int sum, mn, mx, gcd;
  10. };
  11.  
  12. int n, q, a[N];
  13.  
  14. SegTreeNode t[4 * N];
  15.  
  16. SegTreeNode combine(SegTreeNode a, SegTreeNode b) {
  17.     SegTreeNode res;
  18.     res.sum = a.sum + b.sum;
  19.     res.mn = min(a.mn, b.mn);
  20.     res.mx = max(a.mx, b.mx);
  21.     res.gcd = __gcd(a.gcd, b.gcd);
  22. }
  23.  
  24. ///O(n)
  25. ///we want to calculate value for vertex v which represents the range [vl; vr]
  26. void build(int v, int vl, int vr) {
  27.     if (vl == vr) {
  28.         t[v] = a[vl];
  29.         return;
  30.     }
  31.     int vm = (vl + vr) / 2;
  32.     ///calculate left son
  33.     build(2 * v, vl, vm);
  34.     ///calculate right son
  35.     build(2 * v + 1, vm + 1, vr);
  36.  
  37.     ///combine them
  38.     //t[v] = t[2 * v] + t[2 * v + 1];
  39.     t[v] = combine(t[2 * v], t[2 * v + 1]);
  40. }
  41.  
  42.  
  43. ///O(log n)
  44. void update(int v, int vl, int vr, int pos, int val) {
  45.     if (vl == vr) {
  46.         ///vl == vr == pos
  47.         t[v] = val;
  48.         a[vl] = val;
  49.         return;
  50.     }
  51.     int vm = (vl + vr) / 2;
  52.     if (pos <= vm)
  53.         ///the position in the left half => calculate left son
  54.         update(2 * v, vl, vm, pos, val);
  55.     else
  56.         ///the position in the right half => calculate right son
  57.         update(2 * v + 1, vm + 1, vr, pos, val);
  58.  
  59.     ///combine them
  60.     t[v] = combine(t[2 * v], t[2 * v + 1]);
  61. }
  62.  
  63. ///O(log n)
  64. SegTreeNode get(int v, int vl, int vr, int l, int r) {
  65.     if (vl == l && vr == r)
  66.         return t[v];
  67.     int vm = (vl + vr) / 2;
  68.     ///completely in the left son
  69.     if (r <= vm)
  70.         return get(2 * v, vl, vm, l, r);
  71.  
  72.     ///completely in the right son
  73.     if (l > vm)
  74.         return get(2 * v + 1, vm + 1, vr, l, r);
  75.  
  76.     ///split by vm
  77.     return combine(get(2 * v, vl, vm, l, vm), get(2 * v + 1, vm + 1, vr, vm + 1, r));
  78. }
  79.  
  80. signed main()
  81. {
  82.     return 0;
  83. }
  84.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement