#include<cstdio> using namespace std; struct data{ int l,r,tag; long long sum; }tr[600000]; int n,q,a[200001]; void build(int k,int l,int r) { tr[k].l=l,tr[k].r=r; if(l==r){tr[k].sum=a[l];return;} int mid=(l+r)>>1; build(k<<1,l,mid);build(k<<1|1,mid+1,r); tr[k].sum=tr[k<<1].sum+tr[k<<1|1].sum; } void pushdown(int k) { int x=tr[k].r-tr[k].l+1; int tag=tr[k].tag;tr[k].tag=0; if(x==1||!tag)return; tr[k<<1].tag+=tag; tr[k<<1].sum+=(x-(x>>1))*tag; tr[k<<1|1].tag+=tag; tr[k<<1|1].sum+=(x>>1)*tag; } void update(int k,int a,int b,int x) { pushdown(k); int l=tr[k].l,r=tr[k].r; if(a==l&&b==r){ tr[k].tag+=x; tr[k].sum+=(b-a+1)*x; return; } int mid=(l+r)>>1; if(b<=mid)update(k<<1,a,b,x); else if(a>mid)update(k<<1|1,a,b,x); else{ update(k<<1,a,mid,x); update(k<<1|1,mid+1,b,x); } tr[k].sum=tr[k<<1].sum+tr[k<<1|1].sum; } long long ask(int k,int a,int b) { pushdown(k); int l=tr[k].l,r=tr[k].r; if(l==a&&r==b)return tr[k].sum; int mid=(l+r)>>1; if(b<=mid)return ask(k<<1,a,b); else if(a>mid)return ask(k<<1|1,a,b); else return ask(k<<1,a,mid)+ask(k<<1|1,mid+1,b); } int main() { scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]); build(1,1,n); scanf("%d",&q); for(int i=1;i<=q;i++){ int temp,A,b,c; scanf("%d",&temp); if(temp==1){ scanf("%d%d%d",&A,&b,&c); update(1,A,b,c); } else { scanf("%d%d",&A,&b); printf("%lld\n",ask(1,A,b)); } } return 0; }