P3372 模板线段树 1
Posted lsworld
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了P3372 模板线段树 1相关的知识,希望对你有一定的参考价值。
#include<iostream>
#include<cstdio>
using namespace std;
const int maxx=100010;
int n,m,a[maxx],add[maxx*4];
long long sum[maxx*4];
void build(int k,int l,int r)
{
if(l==r)
{
sum[k]=a[l];
return;
}
int mid=(l+r)>>1;
build(k<<1,l,mid);
build(k<<1|1,mid+1,r);
sum[k]=sum[k<<1]+sum[k<<1|1];
}
void Add(int k,int l,int r,int v)
{
add[k]+=v;
sum[k]+=(long long)v*(r-l+1);
}
void pushdown(int k,int l,int r,int mid)
{
if(add[k]==0) return;
Add(k<<1,l,mid,add[k]);
Add(k<<1|1,mid+1,r,add[k]);
add[k]=0;
}
long long query(int k,int l,int r,int x,int y)
{
if(l>=x&&r<=y) return sum[k];
int mid=(l+r)>>1;
long long res=0;
pushdown(k,l,r,mid);
if(x<=mid) res+=query(k<<1,l,mid,x,y);
if(mid<y) res+=query(k<<1|1,mid+1,r,x,y);
return res;
}
void modify(int k,int l,int r,int x,int y,int v)
{
if(l>=x&&r<=y) return Add(k,l,r,v);
int mid=(l+r)>>1;
pushdown(k,l,r,mid);
if(x<=mid) modify(k<<1,l,mid,x,y,v);
if(mid<y) modify(k<<1|1,mid+1,r,x,y,v);
sum[k]=sum[k<<1]+sum[k<<1|1];
}
int main()
{
int i;
cin>>n>>m;
for(i=1;i<=n;i++)
cin>>a[i];
build(1,1,n);
while(m--)
{
int qwq,start,end,f;
cin>>qwq;
if(qwq==1)
{
cin>>start>>end>>f;
modify(1,1,n,start,end,f);
}
if(qwq==2)
{
cin>>start>>end;
long long ans=query(1,1,n,start,end);
printf("%lld
",ans);
}
}
return 0;
}
背下来(
以上是关于P3372 模板线段树 1的主要内容,如果未能解决你的问题,请参考以下文章