AhmedAshraff

Untitled

Aug 1st, 2025
547
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.46 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2.  
  3. using namespace std;
  4. typedef long long ll;
  5. #define sz(s) (int)(s).size()
  6. #define all(s) s.begin(),s.end()
  7.  
  8. void Speed() {
  9.     ios_base::sync_with_stdio(false);
  10.     cin.tie(NULL);
  11. }
  12.  
  13. struct Node {
  14.     ll val = 1e17, lazy = 0;
  15. } neutral;
  16. struct segtree {
  17.     segtree *left = nullptr, *right = nullptr;
  18.     Node node = {};
  19.     int start, end;
  20.     segtree(int l = 0, int r = 0) : start(l), end(r) {}
  21.  
  22.     void extend() {
  23.         if (left == nullptr) {
  24.             int mid = start + end >> 1;
  25.             left = new segtree(start, mid);
  26.             right = new segtree(mid + 1, end);
  27.         }
  28.     }
  29.     Node pushup(Node a, Node b) {
  30.         Node ret;
  31.         ret.val = min(a.val, b.val);
  32.         return ret;
  33.     }
  34.     void pushdown() {
  35.         node.val += node.lazy;
  36.         if (start != end) {
  37.             extend();
  38.             left->node.lazy += node.lazy;
  39.             right->node.lazy += node.lazy;
  40.         }
  41.         node.lazy = 0;
  42.     }
  43.  
  44.     void update(int l, int r, ll val, bool set_upd = 0) {
  45.         pushdown();
  46.         if (start > r || end < l)
  47.             return;
  48.         if (start >= l && end <= r) {
  49.             if(set_upd){
  50.                 assert(l == r);
  51.                 node.val = val;
  52.                 return;
  53.             }
  54.             node.lazy = val;
  55.             pushdown();
  56.             return;
  57.         }
  58.         extend();
  59.         left->update(l, r, val, set_upd);
  60.         right->update(l, r, val, set_upd);
  61.         node = pushup(left->node, right->node);
  62.     }
  63.     Node query(int l, int r) {
  64.         pushdown();
  65.         if (r < start || end < l)
  66.             return neutral;
  67.         if (l <= start && end <= r)
  68.             return node;
  69.         extend();
  70.         Node ret = pushup(left->query(l , r), right->query(l , r));
  71.         return ret;
  72.     }
  73.     ~segtree() {
  74.         if (left == nullptr)return;
  75.         delete left;
  76.         delete right;
  77.     }
  78. }*A, *B;
  79.  
  80.  
  81. struct Node1{
  82.     ll need = 0, lazy = 0;
  83. } neutral1;
  84. struct segtree1{
  85.     segtree1 *left = nullptr, *right = nullptr;
  86.     Node1 node = {};
  87.     int start, end;
  88.     segtree1(int l = 0, int r = 0) : start(l), end(r) {}
  89.  
  90.     void extend() {
  91.         if (left == nullptr) {
  92.             int mid = start + end >> 1;
  93.             left = new segtree1(start, mid);
  94.             right = new segtree1(mid + 1, end);
  95.         }
  96.     }
  97.     Node1 pushup(Node1 a, Node1 b) {
  98.         Node1 ret;
  99.         ret.need = min(a.need, b.need);
  100.         return ret;
  101.     }
  102.     void pushdown() {
  103.         node.need += node.lazy;
  104.         if (start != end) {
  105.             extend();
  106.             left->node.lazy += node.lazy;
  107.             right->node.lazy += node.lazy;
  108.         }
  109.         node.lazy = 0;
  110.     }
  111.  
  112.     void update(int l, int r, ll val) {
  113.         pushdown();
  114.         if (start > r || end < l)
  115.             return;
  116.         if (start >= l && end <= r) {
  117.             node.lazy = val;
  118.             pushdown();
  119.             return;
  120.         }
  121.         extend();
  122.         left->update(l, r, val);
  123.         right->update(l, r, val);
  124.         node = pushup(left->node, right->node);
  125.     }
  126.     void check(int l, int r) {
  127.         pushdown();
  128.         if (r < start || end < l || node.need > 0) return;
  129.         if(start == end){
  130.             B->update(start, end, A->query(start, end).val - node.need, 1);
  131.             A->update(start, end, 1e17, 1);
  132.             node.need = 1e17;
  133.             return;
  134.         }
  135.         extend();
  136.         left->check(l , r);
  137.         right->check(l , r);
  138.         node = pushup(left->node, right->node);
  139.     }
  140.     ~segtree1() {
  141.         if (left == nullptr)return;
  142.         delete left;
  143.         delete right;
  144.     }
  145. }*seg;
  146.  
  147. void solve() {
  148.     int n, q; cin >> n >> q;
  149.     A = new segtree(0, n - 1);
  150.     B = new segtree(0, n - 1);
  151.     seg = new segtree1(0, n - 1);
  152.     vector<int> a(n);
  153.     for(auto& it : a) cin >> it;
  154.  
  155.     for(int i = 0; i < n; i++){
  156.         A->update(i, i, a[i], 1);
  157.         B->update(i, i, 1e17, 1);
  158.         seg->update(i, i, a[i]);
  159.     }
  160.     while(q--){
  161.         int t, l, r; cin >> t >> l >> r; l--; r--;
  162.         if(t == 1){
  163.             int x; cin >> x;
  164.             B->update(l, r, x);
  165.             seg->update(l, r, -x);
  166.             seg->check(0, n - 1);
  167.         }
  168.         if(t == 2){
  169.             cout << min(A->query(l, r).val, B->query(l, r).val) << '\n';
  170.         }
  171.     }
  172.  
  173. }
  174.  
  175. int main() {
  176.     Speed();
  177.     int tc = 1;
  178.     //cin >> tc;
  179.     while (tc--) {
  180.         solve();
  181.     }
  182.     return 0;
  183. }
Advertisement
Add Comment
Please, Sign In to add comment