#include<iostream>
#include<cstdio>
#include<cstdlib>
#define maxn 950000
#define ls (num<<1)
#define rs (num<<1|1)
using namespace std;
long long a[maxn],tree[maxn],size[maxn],lazy[maxn];
void build (
long long num,
long long l,
long long r)
{
size[num]=(r-l+
1);
if (l==r)
{
tree[num]=a[l];
return ;
}
long long mid=(l+r)>>
1;
build (ls,l,mid);
build (rs,mid+
1,r);
tree[num]=tree[ls]+tree[rs];
}
void down (
long long num)
{
tree[ls]+=lazy[num]*size[ls];
tree[rs]+=lazy[num]*size[rs];
lazy[ls]+=lazy[num],lazy[rs]+=lazy[num];
lazy[num]=
0;
}
void update(
long long num,
long long l,
long long r,
long long x,
long long y,
long long z)
{
if (l!=r) down(num);
if (x<=l&&r<=y)
{
tree[num]+=z*size[num];
lazy[num]+=z;
return ;
}
long long mid=(l+r)>>
1;
if (x<=mid) update(ls,l,mid,x,y,z);
if (y>mid) update(rs,mid+
1,r,x,y,z);
tree[num]=tree[ls]+tree[rs];
}
long long query(
long long num,
long long l,
long long r,
long long x,
long long y)
{
if (l!=r) down(num);
if (x<=l&&r<=y)
return tree[num];
long long mid=(l+r)>>
1;
long long res=
0;
if (x<=mid) res+=query(ls,l,mid,x,y);
if (y>mid) res+=query(rs,mid+
1,r,x,y);
tree[num]=tree[ls]+tree[rs];
return res;
}
int main()
{
long long n,m;
scanf (
"%lld",&n);
for (
long long i=
1;i<=n;++i)
scanf (
"%lld",&a[i]);
build (
1,
1,n);
scanf (
"%lld",&m);
for (
long long i=
1;i<=m;++i)
{
long long b,x,y,z;
scanf (
"%lld",&b);
if (b==
1)
{
scanf (
"%lld%lld%lld",&x,&y,&z);
update(
1,
1,n,x,y,z);
}
else
{
scanf (
"%lld%lld",&x,&y);
printf(
"%lld\n",query(
1,
1,n,x,y));
}
}
return 0;
}
这次一小时死于只输入一个lld 大概不是智商问题而是视力问题 绝望
转载请注明原文地址: https://ju.6miu.com/read-300029.html