/Giá trị lớn nhất ver2

<Problem>

https://oj.vnoi.info/problem/qmax2
              #include <iostream>
        #include <cmath>
        using namespace std;
        
        int n;
        long long arr[50001];
        
        
        /*
          Nguoi ta chung minh duoc rang mang tree chi can n * 4
          phan tu la duoc
        */
        long long tree[50001 * 4];
        long long lazy[50001 * 4];
        
        void update(int index, int left, int right, int a, int b, int val) {
          // neu left va right nam ngoai han doan [a,b]
          if (right < a || left > b) return;
        
          if (left >= a && right <= b) {
            tree[index] += val;
            lazy[index] += val;
            return;
          }
        
          int mid = (left + right) / 2;
          update(index * 2, left, mid, a, b, val);
          update(index * 2 + 1, mid + 1, right, a, b, val);
        
          tree[index] = max(tree[index * 2], tree[index * 2 + 1]) + lazy[index];
        }
        
        // lay gia tri lon nhat trong doan a, b
        int getVal(int index, int left, int right, int a, int b) {
          if (right < a || left > b) return -1;
        
          if (left >= a && right <= b) {
            return tree[index];
          }
        
          int mid = (left + right) / 2;
          return max(getVal(index * 2, left, mid, a, b), getVal(index * 2 + 1, mid + 1, right, a, b)) + lazy[index];
        
        }
        
        
        int main() {
          int n, m;
          cin >> n >> m;
        
          for (int i = 1; i <= n; i++) arr[i] = 0;
        
          for (int i = 1; i <= m; i++) {
            int a, l, r, k;
            cin >> a >> l >> r;
            if (a == 0) cin >> k;
        
            if (a == 0) {
              update(1, 1, n, l, r, k);
            }
            else {
              cout << getVal(1, 1, n, l, r) << endl;
            }
          }
        
          return 0;
        }