Luogu P3372 【模板】线段树 1
#include<cstdio> using namespace std; const int maxn = 100005; int n,m,x,y,flag; int l[4*maxn],r[4*maxn]; long long lazy[8*maxn],sum[4*maxn]; void build(int L,int R,int now) { lazy[now] = 0; l[now] = L; r[now] = R; if(L == R) { scanf("%lld",&sum[now]); return; } int mid = (L+R)/2; build(L,mid,now*2); build(mid+1,R,now*2+1); sum[now] = sum[now*2] + sum[now*2+1]; } long long query(int L,int R,int now) { sum[now] += lazy[now] * (r[now] - l[now] + 1); lazy[now*2] += lazy[now]; lazy[now*2+1] += lazy[now]; lazy[now] = 0; if(l[now] == L && r[now] == R)return sum[now]; int mid = (l[now]+r[now])/2; if(R <= mid) return query(L,R,now*2); else if(L >= mid+1) return query(L,R,now*2+1); else return query(L,mid,now*2)+query(mid+1,R,now*2+1); } void modify(int L,int R,long long d,int now){ if(l[now] == L && r[now] == R) { lazy[now] += d; return; } sum[now] += (long long)d*(R-L+1); int mid = (l[now]+r[now])/2; if(R <= mid) modify(L,R,d,now*2); else if(L >= mid+1) modify(L,R,d,now*2+1); else { modify(L,mid,d,now*2); modify(mid+1,R,d,now*2+1); } } int main() { scanf("%d%d",&n,&m); build(1,n,1); while(m) { m--; scanf("%d",&flag); if(flag == 1) { long long k; scanf("%d%d%lld",&x,&y,&k); modify(x,y,k,1); } if(flag == 2) { scanf("%d%d",&x,&y); printf("%lld\n",query(x,y,1)); } } return 0; }