#include <iostream>
using namespace std;
const int MAX = 100000;
struct range {
unsigned int left;
unsigned int right;
int v;
int max;
int min;
int sum;
} tree[MAX];
// 更新指定位置上的值
void _rangeupdate(unsigned int position, int value, unsigned int root) {
if (tree[root].left == tree[root].right) {
tree[root].v = value;
tree[root].max = value;
tree[root].min = value;
tree[root].sum = value;
return;
}
unsigned int mid = (tree[root].left + tree[root].right) / 2;
if (position > mid) {
_rangeupdate(position, value, root*2+2);
} else {
_rangeupdate(position, value, root*2+1);
}
tree[root].max = max(tree[root*2+1].max, tree[root*2+2].max);
tree[root].min = min(tree[root*2+1].min, tree[root*2+2].min);
tree[root].sum = tree[root*2+1].sum + tree[root*2+2].sum;
}
// 区间和
int _rangesum(unsigned int left, unsigned int right, unsigned int root) {
if (left == root && right == root) {
return tree[root].sum;
}
unsigned int mid = (tree[root].left + tree[root].right ) / 2;
if (left > mid) {
return _rangesum(left, right, root*2+2);
} else if (right <= mid) {
return _rangesum(left, right, root*2+1);
}
return _rangesum(left, mid, root*2+1) + _rangesum(mid+1, right, root*2+2);
}
// 创建区间
void buildrange(unsigned int root, int data[], unsigned int left, unsigned int right) {
tree[root].left = left;
tree[root].right = right;
if (left == right) {
tree[root].max = data[left];
tree[root].min = data[left];
tree[root].sum = data[left];
return;
} else {
unsigned int mid = (left + right) / 2;
buildrange(root*2+1, data, left, mid);
buildrange(root*2+2, data, mid+1, right);
tree[root].max = max(tree[root*2+1].max, tree[root*2+2].max);
tree[root].min = min(tree[root*2+1].min, tree[root*2+2].min);
tree[root].sum = tree[root*2+1].sum + tree[root*2+2].sum;
return;
}
}
// 更新区间指定位置的值
void updaterange(unsigned int position, int value) {
_rangeupdate(position, value, 0);
}
int rangesum(unsigned int left, unsigned int right) {
return _rangesum(left, right, 0);
}
int main(int argc, char *argv[]) {
int n,m;
cin >> n>>m;
int data[n];
for (int i=0; i<n; ++i) {
cin >> data[i];
}
buildrange(0, data, 0, n-1);
while(m--) {
int s,x,y,k;
cin>>s;
if(s==1){
cin>>x>>y>>k;
for(int i=x-1;i<y;++i){
updaterange(i,data[i]+k);
}
}
else if(s==2){
cin>>x>>y;
cout<<rangesum(x-1,y-1)<<'\n';
}
}
return 0;
}