应该是区间修改+区间求和=.=
#include<set>
#include<string>
#include<cstring>
#include<cmath>
#include<iostream>
#include<cstdio>
#include<map>
#include<queue>
#include<algorithm>
#include<stack>
using namespace std;
#define LL long long
#define MAXN 0x3f3f3f3f
#define INF 500007
LL read()
{
LL x=0,w=1;
char ch=0;
while(ch<'0'||ch>'9')
{
if(ch=='-')
w=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9')
{
x=x*10+ch-'0';
ch=getchar();
}
return w*x;
}
struct node
{
LL l,r,lazy,w;
};
node tree[INF*4];
LL n,q,f,xx,yy,ans,d;
void update(LL k)
{
tree[k].w=tree[k<<1].w+tree[k<<1|1].w;
}
void build(int x,int y,int k)
{
tree[k].l=x;
tree[k].r=y;
if(x==y)
{
tree[k].w=read();
return ;
}
LL mid=(x+y)>>1;
build(x,mid,k<<1);
build(mid+1,y,k<<1|1);
update(k);
}
void down(LL k)
{
tree[k<<1].lazy+=tree[k].lazy;
tree[k<<1|1].lazy+=tree[k].lazy;
tree[k<<1].w+=tree[k].lazy*(tree[k<<1].r-tree[k<<1].l+1);
tree[k<<1|1].w+=tree[k].lazy*(tree[k<<1|1].r-tree[k<<1|1].l+1);
tree[k].lazy=0;
}
void add(LL x,LL y,LL num,LL k)
{
if(tree[k].l>=x&&tree[k].r<=y)
{
tree[k].w+=num*(tree[k].r-tree[k].l+1);
tree[k].lazy+=num;
return ;
}
down(k);
LL mid=(tree[k].l+tree[k].r)>>1;
if(x<=mid)
{
add(x,y,num,k<<1);
}
if(y>mid)
{
add(x,y,num,k<<1|1);
}
update(k);
}
void oneadd(LL nx,LL num,LL k)
{
if(tree[k].l==tree[k].r&&tree[k].l==nx)
{
tree[k].w+=num;
return ;
}
LL mid=(tree[k].l+tree[k].r)>>1;
down(k);
if(nx<=mid)
oneadd(nx,num,k<<1);
else
oneadd(nx,num,k<<1|1);
update(k);
}
LL getsum(LL x,LL y,LL k)
{
LL res=0;
if(tree[k].l>=x&&tree[k].r<=y)
{
res=tree[k].w;
return res;
}
down(k);
LL mid=(tree[k].l+tree[k].r)>>1;
if(x<=mid)
res+=getsum(x,y,k<<1);
if(y>mid)
res+=getsum(x,y,k<<1|1);
return res;
}
int main()
{
n=read();
build(1,n,1);
q=read();
while(q--)
{
f=read();
xx=read();
yy=read();
if(f==1)
{
d=read();
add(xx,yy,d,1);
}
else
{
ans=getsum(xx,yy,1);
printf("%lld\n",ans);
}
}
return 0;
}