#include<bits/stdc++.h>
using namespace std;
#define root 1,n,1
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
const int maxn=100010;
int n,m,a[maxn];
struct node{
int sum;
int sum2;
int size;
int add;
node(){sum=size=add=0;}
void init(int v){sum=v;sum2=v*v;size=1;}
}z[maxn<<2];
node operator+(const node&l,const node&r){
node res;
res.sum2=l.sum2+r.sum2;
res.sum=l.sum+r.sum;
res.size=l.size+r.size;
return res;
}
void color(int l,int r,int rt,int v){
z[rt].add+=v;
z[rt].sum2=z[rt].sum2+2*v*z[rt].sum+z[rt].size*v*v;
z[rt].sum+=z[rt].size*v;
}
void push_col(int l,int r,int rt){
if(z[rt].add==0)return;
int m=(l+r)>>1;
color(lson,z[rt].add);
color(rson,z[rt].add);
z[rt].add=0;
}
void build(int l,int r,int rt){
if(l==r){
z[rt].init(a[l]);
return;
}
int m=(l+r)>>1;
build(lson);
build(rson);
z[rt]=z[rt<<1]+z[rt<<1|1];
}
node query(int l,int r,int rt,int nowl,int nowr){
if(nowl<=l&&r<=nowr)return z[rt];
push_col(l,r,rt);
int m=(l+r)>>1;
if(nowl<=m){
if(m<nowr)return query(lson,nowl,nowr)+query(rson,nowl,nowr);
else return query(lson,nowl,nowr);
}
else return query(rson,nowl,nowr);
}
void modify(int l,int r,int rt,int nowl,int nowr,int v){
if(nowl<=l&&r<=nowr){
color(l,r,rt,v);
return;
}
push_col(l,r,rt);
int m=(l+r)>>1;
if(nowl<=m)modify(lson,nowl,nowr,v);
if(m<nowr)modify(rson,nowl,nowr,v);
z[rt]=z[rt<<1]+z[rt<<1|1];
}
int main(){
cin>>n;
for(int i=1;i<=n;i++)cin>>a[i];
build(root);
cin>>m;
for(int i=1;i<=m;i++){
int opt;
cin>>opt;
if(opt==1){
int l,r;
cin>>l>>r;
cout<<query(root,l,r).sum<<"\n";
}
else{
int l,r,v;
cin>>l>>r>>v;
modify(root,l,r,v);
}
}
return 0;
}