线段树模板170分求助
听说灌水去大佬多
#include<bits/stdc++.h>
using namespace std;
int a[1000005];
struct node
{
int l,r,w,f;
}tree[4000005];
int c,x,y,z,n,m;
void build(int k,int ll,int rr)
{
int mid;
if(ll>rr) return;
if(ll==rr){
tree[k].l=ll;
tree[k].r=rr;
tree[k].w=a[ll];
return;
}
mid=(ll+rr)/2;
build(k*2,ll,mid);
build(k*2+1,mid+1,rr);
tree[k].l=ll;
tree[k].r=rr;
tree[k].w=tree[k*2].w+tree[k*2+1].w;
return;
}
void down(int k)
{
tree[k*2].w+=((tree[k*2].r-tree[k*2].l+1)*tree[k].f);
tree[k*2+1].w+=((tree[k*2+1].r-tree[k*2+1].l+1)*tree[k].f);
tree[k*2].f+=tree[k].f;
tree[k*2+1].f+=tree[k].f;
tree[k].f=0;
return;
}
void add(int k,int t,int w)
{
int mid;
if(t>w) return;
if(x<=t && w<=y){
tree[k].w+=(w-t+1)*z;
tree[k].f+=z;
return;
}
mid=(t+w)/2;
if(tree[k].f) down(k);
if(x<=mid) add(k*2,t,mid);
if(y>mid) add(k*2+1,mid+1,w);
tree[k].w=tree[k*2].w+tree[k*2+1].w;
return;
}
int ask(int k,int t,int w)
{ int mid;
if(t>w) return 0;
if(x<=t&&w<=y){
return tree[k].w;
}
mid=(t+w)/2;
if(tree[k].f) down(k);
int sum=0;
if(x<=mid) sum+=ask(k*2,t,mid);
if(y>mid) sum+=ask(k*2+1,mid+1,w);
tree[k].w=tree[k*2].w+tree[k*2+1].w;
return sum;
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
}
build(1,1,n);
while(m--){
cin>>c>>x>>y;
if(c==1){
cin>>z;
add(1,1,n);
}
else printf("%d\n",ask(1,1,n));
}
return 0;
}