G

henry_wang4412 P3372 【模板】线段树 1 纠正

public
Guest Mar 08, 2025 Never 39
Clone
C++ P3372 【模板】线段树 1 纠正 96 lines (96 loc) | 1.48 KB
1
#include<bits/stdc++.h>
2
#define int long long
3
using namespace std;
4
const int N=1e5+5;
5
struct segment
6
{
7
int l,r,sum,lazy;
8
}s[N<<2];
9
int n,m,a[N],op,x,y,k;
10
void build(int l,int r,int p)
11
{
12
s[p].l=l;
13
s[p].r=r;
14
if(l==r)
15
{
16
s[p].sum=a[l];
17
return ;
18
}
19
int mid=l+r>>1;
20
build(l,mid,p<<1);
21
build(mid+1,r,p<<1|1);
22
s[p].sum=s[p<<1].sum+s[p<<1|1].sum;
23
}
24
void add(int p,int k)
25
{
26
s[p].lazy+=k;
27
s[p].sum+=(s[p].r-s[p].l+1)*k;
28
}
29
void pushdown(int p)
30
{
31
add(p<<1,s[p].lazy);
32
add(p<<1|1,s[p].lazy);
33
s[p].lazy=0;
34
}
35
void update(int x,int y,int k,int p)
36
{
37
if(x <= s[p].l && s[p].r <= y)
38
{
39
add(p,k);
40
return ;
41
}
42
pushdown(p);
43
int mid=s[p].l+s[p].r>>1;
44
if(x<=mid)
45
{
46
update(x,y,k,p<<1);
47
}
48
if(mid+1<=y)
49
{
50
update(x,y,k,p<<1|1);
51
}
52
s[p].sum=s[p<<1].sum+s[p<<1|1].sum;
53
}
54
int query(int l,int r,int p)
55
{
56
// if(s[p].l == s[p].r) // 这是 单点修改
57
if(l<=s[p].l && s[p].r<=r) // 这是 区间修改
58
{
59
return s[p].sum;
60
}
61
pushdown(p);
62
int mid=s[p].l+s[p].r>>1;
63
if(r<=mid)
64
{
65
return query(l,r,p<<1);
66
}
67
if(l>=mid+1)
68
{
69
return query(l,r,p<<1|1);
70
}
71
return query(l,r,p<<1)+query(l,r,p<<1|1);
72
}
73
signed main()
74
{
75
scanf("%d%d",&n,&m);
76
for(int i=1;i<=n;i++)
77
{
78
scanf("%lld",&a[i]);
79
}
80
build(1,n,1);
81
for(int i=1;i<=m;i++)
82
{
83
scanf("%d",&op);
84
if(op==1)
85
{
86
scanf("%d%d%lld",&x,&y,&k);
87
update(x,y,k,1);
88
}
89
else
90
{
91
scanf("%d%d",&x,&y);
92
printf("%lld\n",query(x,y,1));
93
}
94
}
95
return 0;
96
}