Skip to content

Commit 7bd849a

Browse files
authored
Create 370.Range-Addition_SegmentTree_lazyTag.cpp
1 parent 1d796a0 commit 7bd849a

File tree

1 file changed

+101
-0
lines changed

1 file changed

+101
-0
lines changed
Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
// LeetCode 370. Range Addition
2+
3+
class Solution {
4+
class SegTreeNode
5+
{
6+
public:
7+
SegTreeNode* left;
8+
SegTreeNode* right;
9+
int start, end;
10+
int info;
11+
int tag;
12+
SegTreeNode(int a, int b):start(a),end(b),info(0),tag(0),left(NULL),right(NULL){}
13+
};
14+
15+
void init(SegTreeNode* node, int a, int b) // init for range [a,b]
16+
{
17+
if (a==b)
18+
{
19+
node->info = 0;
20+
return;
21+
}
22+
int mid = (a+b)/2;
23+
if (node->left==NULL)
24+
{
25+
node->left = new SegTreeNode(a, mid);
26+
node->right = new SegTreeNode(mid+1, b);
27+
}
28+
init(node->left, a, mid);
29+
init(node->right, mid+1, b);
30+
31+
node->info = node->left->info + node->right->info; // write your own logic
32+
}
33+
34+
void updateRangeBy(SegTreeNode* node, int a, int b, int val)
35+
{
36+
if (b < node->start || a > node->end ) return;
37+
if (a <= node->start && node->end <=b)
38+
{
39+
// write your own logic
40+
node->info += val * len(node);
41+
node->tag += val;
42+
return;
43+
}
44+
45+
pushDown(node);
46+
updateRangeBy(node->left, a, b, val);
47+
updateRangeBy(node->right, a, b, val);
48+
49+
node->info = node->left->info + node->right->info; // write your own logic
50+
}
51+
52+
int len(SegTreeNode* node)
53+
{
54+
return node->end - node->start + 1;
55+
}
56+
57+
void pushDown(SegTreeNode* node)
58+
{
59+
if (node->tag!=0)
60+
{
61+
node->left->info += len(node->left) * node->tag;
62+
node->right->info += len(node->right) * node->tag;
63+
node->left->tag += node->tag;
64+
node->right->tag += node->tag;
65+
node->tag = 0;
66+
}
67+
}
68+
69+
int queryRange(SegTreeNode* node, int a, int b)
70+
{
71+
if (b < node->start || a > node->end )
72+
{
73+
return 0; // write your own logic
74+
}
75+
if (a <= node->start && b>=node->end)
76+
{
77+
return node->info; // write your own logic
78+
}
79+
pushDown(node);
80+
return queryRange(node->left, a, b) + queryRange(node->right, a, b); // write your own logic
81+
}
82+
83+
SegTreeNode* root;
84+
85+
public:
86+
vector<int> getModifiedArray(int length, vector<vector<int>>& updates)
87+
{
88+
SegTreeNode* root = new SegTreeNode(0, length-1);
89+
90+
init(root, 0, length-1);
91+
92+
for (auto& update: updates)
93+
{
94+
updateRangeBy(root, update[0], update[1], update[2]);
95+
}
96+
vector<int>rets(length);
97+
for (int i=0; i<length; i++)
98+
rets[i] = queryRange(root, i, i);
99+
return rets;
100+
}
101+
};

0 commit comments

Comments
 (0)