#include <iostream>
#include <string>
#include <sstream>
#include <utility>
#include <algorithm>
#include <stack>
#include <queue>
#include <deque>
#include <map>
#include <set>

#include <cstdio>
#include <cstdlib>
#include <ctype.h>

using namespace std;

typedef long long longs;

int ST[4001], Add[4001];

void Update(int k, int L, int R, int i, int j, int v)
{
    if (L > j || R < i) return;
    if (i <= L && R <= j)
    {
        ST[k] += v;
        Add[k] += v;
        return;
    }

    Add[k << 1] += Add[k];
    Add[(k << 1) + 1] += Add[k];
    ST[k << 1] += Add[k];
    ST[(k << 1) + 1] += Add[k];
    Add[k] = 0;

    int mid = (L + R) >> 1;
    Update(k << 1, L, mid, i, j, v);
    Update((k << 1) + 1, mid + 1, R, i, j, v);

    ST[k] = max(ST[k << 1], ST[(k << 1) + 1]);
}

int Get(int k, int L, int R, int i, int j)
{
    if (L > j || R < i) return -1000000000;
    if (i <= L && R <= j) return ST[k];

    Add[k << 1] += Add[k];
    Add[(k << 1) + 1] += Add[k];
    ST[k << 1] += Add[k];
    ST[(k << 1) + 1] += Add[k];
    Add[k] = 0;

    int mid = (L + R) >> 1;
    return max(Get(k << 1, L, mid, i, j), Get((k << 1) + 1, mid + 1, R, i, j));
}

int main()
{
    int N, M, k, x, y, v;

    cin >> N >> M;
    while (M--)
    {
        cin >> k >> x >> y;
        if (k) cout << Get(1, 1, N, x, y) << endl; else
        {
            cin >> v;
            Update(1, 1, N, x, y, v);
        }
    }

    return 0;
}
