#include<iostream>
#include<cstring>
#define Size 1000005
using namespace std;
struct Node{
int l,r,mid;
long long sum,tag;
}tree[Size];
void build(int num,int l,int r){//建树
tree[num].l=l;
tree[num].r=r;
tree[num].mid=(l+r)/2;
if(l<r){
build(num*2,l,tree[num].mid);
build(num*2+1,tree[num].mid+1,r);
}
}
void single_insert(int num,int x,int d){//单点修改:元素x加上d
if(tree[num].l==tree[num].r)tree[num].sum+=d;
else{
if(x<=tree[num].l)single_insert(num*2,x,d);
else single_insert(num*2+1,x,d);
tree[num].sum=tree[num*2].sum+tree[num*2+1].sum;
}
}
long long interval_query(int num,int l,int r){//区间查询
long long ans=0;
if(l<=tree[num].l&&r>=tree[num].r)return tree[num].sum;
else{
if(l<=tree[num].mid)ans+=interval_query(num*2,l,r);
if(r>tree[num].mid)ans+=interval_query(num*2+1,l,r);
return ans;
}
}
void interval_update(int num,int l,int r,int d){//区间修改
if(l<=tree[num].l&&r>=tree[num].r)tree[num].tag+=d;
else{
if(l<=tree[num].mid)interval_update(num*2,l,r,d);
if(r>tree[num].mid)interval_update(num*2+1,l,r,d);
tree[num].sum=
tree[num*2].sum+(tree[num*2].r-tree[num*2].l+1)*tree[num*2].tag+
tree[num*2+1].sum+(tree[num*2+1].r-tree[num*2+1].l+1)*tree[num*2+1].tag;
}
}
int single_query(int num,int x){//单点查询
long long ans=0;
if(tree[num].l==tree[num].r)return tree[num].sum+tree[num].tag;
else{
tree[num].sum+=tree[num].tag;
tree[num*2].tag+=tree[num].tag;
tree[num*2+1].tag+=tree[num].tag;
tree[num].tag=0;
if(x<=tree[num].mid)return single_query(num*2,x);
else return single_query(num*2+1,x);
}
}
long long tag_interval_query(int num,int l,int r){//带tag的区间查询
long long ans=0;
if(l<=tree[num].l&&r>=tree[num].r)
return tree[num].sum+(tree[num].r-tree[num].l+1)*tree[num].tag;
else{
if(tree[num].tag!=0){
tree[num].sum+=(tree[num].r-tree[num].l+1)*tree[num].tag;
tree[num*2].tag+=tree[num].tag;
tree[num*2+1].tag+=tree[num].tag;
tree[num].tag=0;
}
if(l<=tree[num].mid)ans+=tag_interval_query(num*2,l,r);
if(r>tree[num].mid)ans+=tag_interval_query(num*2+1,l,r);
return ans;
}
}
int main(){//codevs 1082 线段树练习3
memset(tree,0,sizeof(tree));
int n,a; cin>>n;
build(1,1,n);
for(int i=1;i<=n;i++){
cin>>a;
interval_update(1,i,i,a);
}
int m,q,l,r,x; cin>>m;
for(int i=1;i<=m;i++){
cin>>q;
if(q==1){
cin>>l>>r>>x;
interval_update(1,l,r,x);
}
else{
cin>>l>>r;
cout<<tag_interval_query(1,l,r)<<endl;
}
}
}