#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
#include <cstdio>
#include <fstream>
#include <algorithm>
#include <cmath>
#include <deque>
#include <vector>
#include <queue>
#include <string>
#include <cstring>
#include <map>
#include <stack>
#include <set>
using namespace std;
const int N=1e5+50;
long long int m,n,s,e;
long long int p[N];
struct date
{
long long int sum;
long long int l,r,add;
}tree[4*N];
void pushup(long long int u)
{
tree[u].sum=tree[u<<1].sum+tree[u<<1|1].sum;
}
void change(long long int u,long long int k)
{
tree[u].sum+=(tree[u].r-tree[u].l+1)*k;
tree[u].add+=k;
}
void pushdown(long long int u)
{
if(tree[u].add)
{
change(u<<1,tree[u].add);
change(u<<1|1,tree[u].add);
tree[u].add=0;
}
}
void build(long long int x,long long int l,long long int r)
{
tree[x].l=l,tree[x].r=r;
if(l==r)
{
tree[x].sum=p[l];
tree[x].add=0;
return;
}
long long int mid=l+r>>1;
build(x<<1,l,mid);
build(x<<1|1,mid+1,r);
pushup(x);
}
long long int query(long long int u,long long int l,long long int r)
{
if(tree[u].l>=l&&tree[u].r<=r)
return tree[u].sum;
long long int mid=tree[u].l+tree[u].r>>1;
pushdown(u);
long long int res=0;
if(mid>=l) res+=query(u<<1,l,r);
if(r>mid) res+=query(u<<1|1,l,r);
return res;
}
void modify(long long int u,long long int l,long long int r,long long int k)
{
if(tree[u].l>=l&&tree[u].r<=r)
{
change(u,k);
return;
}
long long int mid=tree[u].l+tree[u].r>>1;
pushdown(u);
if(l<=mid)
modify(u<<1,l,r,k);
if(r>mid)
modify(u<<1|1,l,r,k);
pushup(u);
}
int main()
{
long long int i,j;
cin>>n>>m;
for(i=1;i<=n;i++)
{
cin>>p[i];
}
build(1,1,n);
while(m--)
{
int z;
cin>>z;
if(z==1)
{
long long int w1,w2,w3;
cin>>w1>>w2>>w3;
modify(1,w1,w2,w3);
}
else if(z==2)
{
long long int w1,w2;
cin>>w1>>w2;
long long int t=query(1,w1,w2);
cout<<t<<'\n';
}
}
return 0;
}