#include<bits/stdc++.h>
using namespace std;

const int MAX_N = 1e5 + 5;
const int BLOCK_SIZE = 320;

int n;
long long a[MAX_N];
long long bl[MAX_N / BLOCK_SIZE + 5];
long long s[MAX_N / BLOCK_SIZE + 5];

void blockUpdate(int l, int r, int val){
  for(int i = l; i <= r; i++)
    bl[i] += val;
}

void manualUpdate(int id, int l, int r, int val){
  int L = id * BLOCK_SIZE;
  int R = min(n - 1, (id + 1) * BLOCK_SIZE - 1);

  // cout << L << " " << R << endl;

  for(int i = L; i <= R; i++)
    a[i] += bl[id];

  for(int i = l; i <= r; i++)
    a[i] += val;

  s[id] = 0;
  for(int i = L; i <= R; i++)
    s[id] += a[i];

  bl[id] = 0;
}

int main(){
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);

  int q;
  cin >> n >> q;

  for(int i = 0; i < n; i++)
    cin >> a[i],
    s[i / BLOCK_SIZE] += a[i];

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

    // cout << query << "\n";

    if(query == 1){
      int l, r, val;
      cin >> l >> r >> val;

      // cout << query << " " << l << " " << r << " " << val << '\n';

      --l, --r;

      int blockL = l / BLOCK_SIZE;
      int blockR = r / BLOCK_SIZE;

      if(blockL != blockR){
        blockUpdate(blockL + 1, blockR - 1, val);
        // L -> end block L
        manualUpdate(blockL, l, (blockL + 1) * BLOCK_SIZE - 1, val);
        // start block R -> R
        manualUpdate(blockR, blockR * BLOCK_SIZE, r, val);
      }
      else
        manualUpdate(blockR, l, r, val);
    }

    else{
      int l, r;
      cin >> l >> r;
      --l, --r;

      // cout << query << " " << l << " " << r << " " << '\n';

      int blockL = l / BLOCK_SIZE;
      int blockR = r / BLOCK_SIZE;
      long long ans = 0;

      if(blockL == blockR){
        for(int i = l; i <= r; i++)
          ans += a[i] + bl[blockL];
        cout << ans << '\n';
        continue;
      }

      for(int i = blockL + 1; i <= blockR - 1; i++)
        ans += s[i] + bl[i] * BLOCK_SIZE;
      for(int i = l, endP = (blockL + 1) * BLOCK_SIZE - 1; i <= endP; i++)
        ans += a[i] + bl[blockL];
      for(int i = blockR * BLOCK_SIZE; i <= r; i++)
        ans += a[i] + bl[blockR];

      cout << ans << '\n';
    }
  }

  return 0;
}