/**
Template by Akikaze (秋風) - formerly proptit_4t41.
Code written by a random fan of momocashew and Chiho.
**/
#include <bits/stdc++.h>
using namespace std;
/** -----BASIC MACROES----- **/
#define endl '\n'
#define i64 long long
#define ld long double
#define pub push_back
#define mp make_pair
#define fi first
#define se second
const long long MOD = 1000000007LL, INF = 1e9, LINF = 1e18;
const long double PI = 3.141592653589793116, EPS = 1e-9, GOLD = ((1+sqrt(5))/2);
typedef vector<i64> vi;
typedef vector<ld> vd;
typedef vector<string> vs;
typedef vector<bool> vb;
typedef pair<i64, i64> pii;
typedef pair<i64, pii> pip;
typedef pair<pii, i64> ppi;
/** -----BIT CONTROLS----- **/
template<class T> int getbit(T s, int i) { return (s >> 1) & 1; }
template<class T> T onbit(T s, int i) { return s | (T(1) << i); }
template<class T> T offbit(T s, int i) { return s & (~(T(1) << i)); }
template<class T> int cntbit(T s) { return __builtin_popcount(s); }
/** -----IDEAS/ALGORITHMS-----
-------------------------- **/
/** -----CUSTOM TYPEDEFS/DEFINES----- **/
struct Node {
i64 val = 0;
i64 lazy = 0;
};
/** -----GLOBAL VARIABLES----- **/
i64 n, m;
vector<Node> tree(666666);
/** -----EXTENSIVE FUNCTIONS----- **/
void update(i64 node, i64 st, i64 en, i64 L, i64 R, i64 x) {
if (tree[node].lazy > 0) {
tree[node].val += tree[node].lazy;
if (st != en) {
tree[node*2].lazy += tree[node].lazy;
tree[node*2+1].lazy += tree[node].lazy;
}
tree[node].lazy = 0;
}
if (st > en || st > R || en < L) return;
if (L <= st && en <= R) {
tree[node].val += x;
if (st != en) {
tree[node*2].lazy += x;
tree[node*2+1].lazy += x;
}
return;
}
update(node*2, st, (st+en)/2, L, R, x);
update(node*2+1, (st+en)/2+1, en, L, R, x);
tree[node].val = max(tree[node*2].val, tree[node*2+1].val);
}
i64 get(i64 node, i64 st, i64 en, i64 L, i64 R) {
if (st > en || st > R || en < L) return -LINF;
if (tree[node].lazy > 0) {
tree[node].val += tree[node].lazy;
if (st != en) {
tree[node*2].lazy += tree[node].lazy;
tree[node*2+1].lazy += tree[node].lazy;
}
tree[node].lazy = 0;
}
if (L <= st && en <= R) return tree[node].val;
i64 p1 = get(node*2, st, (st+en)/2, L, R);
i64 p2 = get(node*2+1, (st+en)/2+1, en, L, R);
return max(p1, p2);
}
/** -----COMPULSORY FUNCTIONS----- **/
void VarInput() {
cin >> n >> m;
}
void ProSolve() {
while (m--) {
i64 cmd, l, r; cin >> cmd >> l >> r;
if (cmd == 0) {
i64 value; cin >> value;
update(1, 1, n, l, r, value);
}
else cout << get(1, 1, n, l, r) << endl;
}
}
/** -----MAIN FUNCTION----- **/
int main() {
//freopen("FILE.INP", "r", stdin);
//freopen("FILE.OUT", "w", stdout);
ios_base::sync_with_stdio(0); cin.tie(NULL);
VarInput(); ProSolve(); return 0;
}
LyoqCglUZW1wbGF0ZSBieSBBa2lrYXplICjnp4vpoqgpIC0gZm9ybWVybHkgcHJvcHRpdF80dDQxLgoJQ29kZSB3cml0dGVuIGJ5IGEgcmFuZG9tIGZhbiBvZiBtb21vY2FzaGV3IGFuZCBDaGloby4KKiovCgojaW5jbHVkZSA8Yml0cy9zdGRjKysuaD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCi8qKiAtLS0tLUJBU0lDIE1BQ1JPRVMtLS0tLSAqKi8KI2RlZmluZSBlbmRsICdcbicKI2RlZmluZSBpNjQgbG9uZyBsb25nCiNkZWZpbmUgbGQgbG9uZyBkb3VibGUKI2RlZmluZSBwdWIgcHVzaF9iYWNrCiNkZWZpbmUgbXAgbWFrZV9wYWlyCiNkZWZpbmUgZmkgZmlyc3QKI2RlZmluZSBzZSBzZWNvbmQKY29uc3QgbG9uZyBsb25nIE1PRCA9IDEwMDAwMDAwMDdMTCwgSU5GID0gMWU5LCBMSU5GID0gMWUxODsKY29uc3QgbG9uZyBkb3VibGUgUEkgPSAzLjE0MTU5MjY1MzU4OTc5MzExNiwgRVBTID0gMWUtOSwgR09MRCA9ICgoMStzcXJ0KDUpKS8yKTsKdHlwZWRlZiB2ZWN0b3I8aTY0PiB2aTsKdHlwZWRlZiB2ZWN0b3I8bGQ+IHZkOwp0eXBlZGVmIHZlY3RvcjxzdHJpbmc+IHZzOwp0eXBlZGVmIHZlY3Rvcjxib29sPiB2YjsKdHlwZWRlZiBwYWlyPGk2NCwgaTY0PiBwaWk7CnR5cGVkZWYgcGFpcjxpNjQsIHBpaT4gcGlwOwp0eXBlZGVmIHBhaXI8cGlpLCBpNjQ+IHBwaTsKCi8qKiAtLS0tLUJJVCBDT05UUk9MUy0tLS0tICoqLwp0ZW1wbGF0ZTxjbGFzcyBUPiBpbnQgZ2V0Yml0KFQgcywgaW50IGkpIHsgcmV0dXJuIChzID4+IDEpICYgMTsgfQp0ZW1wbGF0ZTxjbGFzcyBUPiBUIG9uYml0KFQgcywgaW50IGkpIHsgcmV0dXJuIHMgfCAoVCgxKSA8PCBpKTsgfQp0ZW1wbGF0ZTxjbGFzcyBUPiBUIG9mZmJpdChUIHMsIGludCBpKSB7IHJldHVybiBzICYgKH4oVCgxKSA8PCBpKSk7IH0KdGVtcGxhdGU8Y2xhc3MgVD4gaW50IGNudGJpdChUIHMpIHsgcmV0dXJuIF9fYnVpbHRpbl9wb3Bjb3VudChzKTsgfQoKLyoqIC0tLS0tSURFQVMvQUxHT1JJVEhNUy0tLS0tCgogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKiovCgovKiogLS0tLS1DVVNUT00gVFlQRURFRlMvREVGSU5FUy0tLS0tICoqLwpzdHJ1Y3QgTm9kZSB7CglpNjQgdmFsID0gMDsKCWk2NCBsYXp5ID0gMDsKfTsKCi8qKiAtLS0tLUdMT0JBTCBWQVJJQUJMRVMtLS0tLSAqKi8KaTY0IG4sIG07CnZlY3RvcjxOb2RlPiB0cmVlKDY2NjY2Nik7CgovKiogLS0tLS1FWFRFTlNJVkUgRlVOQ1RJT05TLS0tLS0gKiovCnZvaWQgdXBkYXRlKGk2NCBub2RlLCBpNjQgc3QsIGk2NCBlbiwgaTY0IEwsIGk2NCBSLCBpNjQgeCkgewoJaWYgKHRyZWVbbm9kZV0ubGF6eSA+IDApIHsKCQl0cmVlW25vZGVdLnZhbCArPSB0cmVlW25vZGVdLmxhenk7CgkJaWYgKHN0ICE9IGVuKSB7CgkJCXRyZWVbbm9kZSoyXS5sYXp5ICs9IHRyZWVbbm9kZV0ubGF6eTsKCQkJdHJlZVtub2RlKjIrMV0ubGF6eSArPSB0cmVlW25vZGVdLmxhenk7CgkJfQoJCXRyZWVbbm9kZV0ubGF6eSA9IDA7Cgl9CglpZiAoc3QgPiBlbiB8fCBzdCA+IFIgfHwgZW4gPCBMKSByZXR1cm47CglpZiAoTCA8PSBzdCAmJiBlbiA8PSBSKSB7CgkJdHJlZVtub2RlXS52YWwgKz0geDsKCQlpZiAoc3QgIT0gZW4pIHsKCQkJdHJlZVtub2RlKjJdLmxhenkgKz0geDsKCQkJdHJlZVtub2RlKjIrMV0ubGF6eSArPSB4OwoJCX0KCQlyZXR1cm47Cgl9Cgl1cGRhdGUobm9kZSoyLCBzdCwgKHN0K2VuKS8yLCBMLCBSLCB4KTsKCXVwZGF0ZShub2RlKjIrMSwgKHN0K2VuKS8yKzEsIGVuLCBMLCBSLCB4KTsKCXRyZWVbbm9kZV0udmFsID0gbWF4KHRyZWVbbm9kZSoyXS52YWwsIHRyZWVbbm9kZSoyKzFdLnZhbCk7Cn0KCmk2NCBnZXQoaTY0IG5vZGUsIGk2NCBzdCwgaTY0IGVuLCBpNjQgTCwgaTY0IFIpIHsKCWlmIChzdCA+IGVuIHx8IHN0ID4gUiB8fCBlbiA8IEwpIHJldHVybiAtTElORjsKCWlmICh0cmVlW25vZGVdLmxhenkgPiAwKSB7CgkJdHJlZVtub2RlXS52YWwgKz0gdHJlZVtub2RlXS5sYXp5OwoJCWlmIChzdCAhPSBlbikgewoJCQl0cmVlW25vZGUqMl0ubGF6eSArPSB0cmVlW25vZGVdLmxhenk7CgkJCXRyZWVbbm9kZSoyKzFdLmxhenkgKz0gdHJlZVtub2RlXS5sYXp5OwoJCX0KCQl0cmVlW25vZGVdLmxhenkgPSAwOwoJfQoJaWYgKEwgPD0gc3QgJiYgZW4gPD0gUikgcmV0dXJuIHRyZWVbbm9kZV0udmFsOwoJaTY0IHAxID0gZ2V0KG5vZGUqMiwgc3QsIChzdCtlbikvMiwgTCwgUik7CglpNjQgcDIgPSBnZXQobm9kZSoyKzEsIChzdCtlbikvMisxLCBlbiwgTCwgUik7CglyZXR1cm4gbWF4KHAxLCBwMik7Cn0KCi8qKiAtLS0tLUNPTVBVTFNPUlkgRlVOQ1RJT05TLS0tLS0gKiovCnZvaWQgVmFySW5wdXQoKSB7CgljaW4gPj4gbiA+PiBtOwp9Cgp2b2lkIFByb1NvbHZlKCkgewoJd2hpbGUgKG0tLSkgewoJCWk2NCBjbWQsIGwsIHI7IGNpbiA+PiBjbWQgPj4gbCA+PiByOwoJCWlmIChjbWQgPT0gMCkgewoJCQlpNjQgdmFsdWU7IGNpbiA+PiB2YWx1ZTsKCQkJdXBkYXRlKDEsIDEsIG4sIGwsIHIsIHZhbHVlKTsKCQl9CgkJZWxzZSBjb3V0IDw8IGdldCgxLCAxLCBuLCBsLCByKSA8PCBlbmRsOwoJfQp9CgovKiogLS0tLS1NQUlOIEZVTkNUSU9OLS0tLS0gKiovCmludCBtYWluKCkgewoJLy9mcmVvcGVuKCJGSUxFLklOUCIsICJyIiwgc3RkaW4pOwoJLy9mcmVvcGVuKCJGSUxFLk9VVCIsICJ3Iiwgc3Rkb3V0KTsKCWlvc19iYXNlOjpzeW5jX3dpdGhfc3RkaW8oMCk7IGNpbi50aWUoTlVMTCk7CglWYXJJbnB1dCgpOyBQcm9Tb2x2ZSgpOyByZXR1cm4gMDsKfQ==