#include<cstdio>
#include<algorithm>
using namespace std;
int m, n, k, q, w;
long long e;
struct p{
int l,r;
long long sum, seg;
}s[800001];
void tui(int ro, int l, int r)
{
int mid=(l+r)/2;
s[ro*2].seg+=s[ro].seg;
s[ro*2].sum+=s[ro].seg*(mid-l+1);
s[ro*2+1].seg+=s[ro].seg;
s[ro*2+1].sum+=s[ro].seg*(r-(mid+1)+1);
s[ro].seg=0;
}
void bu(int ro, int l, int r)
{
s[ro].l=l;
s[ro].r=r;
int mid=(l+r)/2;
if(l==r){
scanf("%d", &s[ro].sum);
return ;
}
bu(ro*2,l,mid);
bu(ro*2+1,mid+1,r);
s[ro].sum=s[ro*2].sum+s[ro*2+1].sum;
}
long long he(int ro, int l, int r)
{
if(r>=s[ro].r&&l<=s[ro].l) return s[ro].sum;
int mid=(s[ro].l+s[ro].r)/2;
if(s[ro].seg!=0){
tui(ro,s[ro].l, s[ro].r);
}
if(l>mid) return he(ro*2+1,l,r);
else if(r<=mid) return he(ro*2,l,r);
return he(ro*2,l,mid)+he(ro*2+1,mid+1,r);
}
void geng(int d, int l, int r)
{
if(q<=l&&w>=r)
{
s[d].seg+=e;
s[d].sum+=(r-l+1)*e;
return;
}
if(s[d].seg!=0){
tui(d,s[d].l, s[d].r);
}
int mid=(l+r)/2;
if(q<=mid) geng(d*2,l,mid);
if(w>mid) geng(d*2+1,mid+1,r);
s[d].sum=s[d*2].sum+s[d*2+1].sum;
}
int main()
{
scanf("%d", &m);
bu(1,1,m);
scanf("%d", &n);
for(int i=1;i<=n;i++)
{
scanf("%d", &k);
if(k==1)
{
scanf("%d %d %d", &q, &w, &e);
geng(1,1,m);
}
else {
scanf("%d %d", &q, &w);
printf("%lld\n", he(1,q,w));
}
}
return 0;
}
codevs线段树练习3
最新推荐文章于 2018-07-24 18:28:54 发布
143

被折叠的 条评论
为什么被折叠?



