#include <iostream>
#include <vector>

using namespace std;
using ll = long long;

class FenwickTree {
private:
    vector<ll> bit;
    int n;

public:
    FenwickTree(int size) : n(size) {
        bit.resize(n + 1, 0);
    }

    void add(int idx, ll val) {
        idx++;
        while (idx <= n) {
            bit[idx] += val;
            idx += idx & (-idx);
        }
    }

    ll sum(int idx) {
        idx++;
        ll res = 0;
        while (idx > 0) {
            res += bit[idx];
            idx -= idx & (-idx);
        }
        return res;
    }

    ll rangeSum(int l, int r) {
        return sum(r) - (l > 0 ? sum(l - 1) : 0);
    }
};

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);

    int n, q;
    cin >> n >> q;

    vector<int> p(n);
    vector<int> pos(n + 1);  // Position de chaque élément dans p
    for (int i = 0; i < n; i++) {
        cin >> p[i];
        pos[p[i]] = i;
    }

    FenwickTree ft1(n);  // Pour les mises à jour de type 0
    FenwickTree ft2(n);  // Pour les mises à jour de type 1

    while (q--) {
        int type;
        cin >> type;

        if (type == 0) {
            int l, r, x;
            cin >> l >> r >> x;
            l--; r--;
            ft1.add(l, x);
            ft1.add(r + 1, -x);
        }
        else if (type == 1) {
            int l, r, x;
            cin >> l >> r >> x;
            l--; r--;
            ft2.add(l, x);
            ft2.add(r + 1, -x);
        }
        else if (type == 2) {
            int l, r;
            cin >> l >> r;
            l--; r--;
            cout << ft1.rangeSum(l, r) << "\n";
        }
        else {  // type == 3
            int l, r;
            cin >> l >> r;
            l--; r--;
            ll result = 0;
            for (int i = l; i <= r; i++) {
                int actualPos = pos[i + 1];
                result += ft1.rangeSum(actualPos, actualPos) + ft2.rangeSum(i, i);
            }
            cout << result << "\n";
        }
    }

    return 0;
}