#include<bits/stdc++.h>
using namespace std;
long long a[100040];
int tree[400400],lazy[400400];
long long pushup(int node){
int left_node=2*node;
int right_node=2*node+1;
tree[node]=tree[left_node]+tree[right_node];
}
void build_tree(int node,long long l,long long r){
if(l==r){
tree[node]=a[l];
return;
}
else{
long long mid=(l+r)/2;
long long left_node=2*node;
long long right_node=2*node+1;
build_tree(left_node,l,mid);
build_tree(right_node,mid+1,r);
pushup(node);
}
}
void pushdown(int node,long long k){
if(lazy[node]){
long long left_node=2*node;
long long right_node=2*node+1;
lazy[left_node]+=lazy[node];
lazy[right_node]+=lazy[node];
tree[left_node]+=lazy[node]*(k-(k/2));
tree[right_node]+=lazy[node]*(k/2);
lazy[node]=0;
}
}
void update(int node,long long l,long long r,long long left,long long right,long long val){
if(left<=l&&right>=r){
lazy[node]+=val;
tree[node]+=val*(r-l+1);
}
else{
pushdown(node,r-l+1);
int mid=(l+r)/2;
int left_node=2*node;
int right_node=2*node+1;
if(left<=mid)update(left_node,l,mid,left,right,val);
if(right>mid)update(right_node,mid+1,r,left,right,val);
pushup(node);
}
}
long long query(int node,long long l,long long r,long long left,long long right){
if(left<=l&&right>=r){
return tree[node];
}
else{
pushdown(node,r-l+1);
long long mid=(l+r)/2;
long long left_node=2*node;
long long right_node=2*node+1;
long long left_sum=0,right_sum=0;
if(left<=mid){
left_sum=query(left_node,l,mid,left,right);
}
if(right>mid){
right_sum=query(right_node,mid+1,r,left,right);
}
return left_sum+right_sum;
}
}
int n,q;
int main(){
scanf("%d%d",&n,&q);
for(long long i=1;i<=n;i++){
scanf("%lld",&a[i]);
}
build_tree(1,1,n);
while(q--){
int t;
long long l,r,val;
scanf("%d",&t);
if(t==2){
scanf("%lld%lld",&l,&r);
printf("%lld\n",query(1,1,n,l,r));
}
else if(t==1){
scanf("%lld%lld%lld",&l,&r,&val);
update(1,1,n,l,r,val);
}
}
return 0;
}
一个TLE,一个MLE,其他RE