Skip to content

Commit 9a81eb0

Browse files
Merge pull request #655 from dashan124/master
Create Segment_tree_lazy.cpp
2 parents cd632f0 + 2c6ac52 commit 9a81eb0

File tree

1 file changed

+109
-0
lines changed

1 file changed

+109
-0
lines changed
Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
#include <bits/stdc++.h>
2+
using namespace std;
3+
#define ll long long int
4+
#define pb push_back
5+
#define mp make_pair
6+
#define inf LLONG_MAX
7+
#define re1(x) scanf("%lld",&x)
8+
#define re2(x,y) scanf("%lld%lld",&x,&y)
9+
#define re3(x,y,z) scanf("%lld%lld%lld",&x,&y,&z)
10+
11+
ll n,q;
12+
ll arr[100010];
13+
struct node{
14+
ll t;
15+
ll lazy;
16+
};
17+
node st[500100];
18+
void propogate(ll ss,ll se,ll si){
19+
if(st[si].lazy!=0){
20+
st[si].t+=(st[si].lazy*(se-ss+1));
21+
if(ss!=se){
22+
st[2*si+1].lazy+=(st[si].lazy);
23+
st[2*si+2].lazy+=(st[si].lazy);
24+
}
25+
st[si].lazy=0;
26+
}
27+
if(ss>se){
28+
return;
29+
}
30+
return;
31+
}
32+
void update(ll ss,ll se,ll qs,ll qe,ll si,ll val){
33+
propogate(ss,se,si);
34+
if(ss>se||ss>qe||se<qs){
35+
return;
36+
}
37+
if(ss>=qs && se<=qe){
38+
st[si].lazy+=val;
39+
propogate(ss,se,si);
40+
return;
41+
}
42+
ll mid=(ss+se)/2;
43+
update(ss,mid,qs,qe,2*si+1,val);
44+
update(mid+1,se,qs,qe,2*si+2,val);
45+
st[si].t=(st[2*si+1].t)+(st[2*si+2].t);
46+
return;
47+
}
48+
ll query(ll ss,ll se,ll qs,ll qe,ll si){
49+
propogate(ss,se,si);
50+
if(ss>se||ss>qe||se<qs){
51+
return 0;
52+
}
53+
if(ss>=qs && qe>=se){
54+
return st[si].t;
55+
}
56+
ll mid=(ss+se)/2;
57+
ll p1=query(ss,mid,qs,qe,2*si+1);
58+
ll p2=query(mid+1,se,qs,qe,2*si+2);
59+
return p1+p2;
60+
}
61+
void build(ll ss,ll se,ll si){
62+
if(ss>se){
63+
return;
64+
}
65+
if(ss==se){
66+
st[si].t=arr[ss];
67+
st[si].lazy=0;
68+
return;
69+
}
70+
ll mid=(ss+se)/2;
71+
build(ss,mid,2*si+1);
72+
build(mid+1,se,2*si+2);
73+
st[si].t=st[2*si+1].t+st[2*si+2].t;
74+
}
75+
int main(){
76+
ll t;
77+
re1(t);
78+
while(t--){
79+
re2(n,q);
80+
for(ll i=0;i<n;i+=1){
81+
re1(arr[i]);
82+
}
83+
for(ll i=0;i<=4*n;i++){
84+
st[i].t=0;
85+
st[i].lazy=0;
86+
}
87+
build(0,n-1,0);
88+
for(ll i=0;i<q;i++){
89+
ll type;
90+
re1(type);
91+
if(type==1){
92+
ll l,r;
93+
re2(l,r);
94+
l-=1;
95+
r-=1;
96+
ll xx=query(0,n-1,l,r,0);
97+
printf("%lld\n",xx);
98+
}
99+
else{
100+
ll l,r,val;
101+
re3(l,r,val);
102+
l-=1;
103+
r-=1;
104+
update(0,n-1,l,r,0,val);
105+
}
106+
}
107+
}
108+
return 0;
109+
}

0 commit comments

Comments
 (0)