<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;
}