Skip to content

Commit efc065d

Browse files
Add files via upload
1 parent 3dcba5b commit efc065d

File tree

1 file changed

+110
-0
lines changed

1 file changed

+110
-0
lines changed
Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
#include <cstdio>
2+
#include <cstring>
3+
4+
typedef long long LL;
5+
const int MAX_SIZE = 1e5 + 3;
6+
7+
LL tree[3*MAX_SIZE] = {0};
8+
LL lazy[3*MAX_SIZE] = {0};
9+
LL element[MAX_SIZE] = {0};
10+
11+
void propagate(int node, int start, int end)
12+
{
13+
LL no_of_elements = end - (start - 1);
14+
tree[node] += lazy[node]*no_of_elements;
15+
16+
if(start != end)
17+
{
18+
lazy[2*node] += lazy[node];
19+
lazy[2*node + 1] += lazy[node];
20+
}
21+
22+
lazy[node] = 0;
23+
}
24+
25+
void update(int node, int start, int end, int query_start, int query_end, int value)
26+
{
27+
if(lazy[node])
28+
propagate(node, start, end);
29+
30+
if(query_start > end || query_end < start)
31+
return;
32+
33+
if(query_start <= start && end <= query_end)
34+
{
35+
LL no_of_elements = end - (start - 1);
36+
tree[node] += no_of_elements*value;
37+
38+
if(start != end)
39+
{
40+
lazy[2*node] += value;
41+
lazy[2*node + 1] += value;
42+
}
43+
44+
return;
45+
}
46+
47+
int mid = (start + end)/2;
48+
49+
update(2*node, start, mid, query_start, query_end, value);
50+
update(2*node + 1, mid + 1, end, query_start, query_end, value);
51+
52+
tree[node] = tree[2*node] + tree[2*node + 1];
53+
}
54+
55+
LL query(int node, int start, int end, int query_start, int query_end)
56+
{
57+
if(lazy[node])
58+
propagate(node, start, end);
59+
60+
if(query_start > end || query_end < start)
61+
return 0;
62+
63+
if(query_start <= start && end <= query_end)
64+
return tree[node];
65+
66+
int mid = (start + end) >> 1;
67+
68+
LL left_answer = query(2*node, start, mid, query_start, query_end);
69+
LL right_answer = query(2*node + 1, mid + 1, end, query_start, query_end);
70+
71+
return (left_answer + right_answer);
72+
}
73+
74+
void solve()
75+
{
76+
memset(tree, 0, sizeof(tree));
77+
memset(lazy, 0, sizeof(lazy));
78+
79+
int no_of_elements, no_of_queries;
80+
scanf("%d %d", &no_of_elements, &no_of_queries);
81+
82+
while(no_of_queries--)
83+
{
84+
int type, left, right;
85+
scanf("%d %d %d", &type, &left, &right);
86+
87+
if(type == 0)
88+
{
89+
int value;
90+
scanf("%d", &value);
91+
update(1, 1, no_of_elements, left, right, value);
92+
}
93+
else if(type == 1)
94+
{
95+
LL answer = query(1, 1, no_of_elements, left, right);
96+
printf("%lld\n", answer);
97+
}
98+
}
99+
}
100+
101+
int main()
102+
{
103+
int no_of_test_cases;
104+
scanf("%d", &no_of_test_cases);
105+
106+
while(no_of_test_cases--)
107+
solve();
108+
109+
return 0;
110+
}

0 commit comments

Comments
 (0)