Skip to content

Commit 23d3737

Browse files
authored
Update 370.Range-Addition_SegmentTree_lazyTag.cpp
1 parent 53c98a7 commit 23d3737

File tree

1 file changed

+43
-43
lines changed

1 file changed

+43
-43
lines changed
Lines changed: 43 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,11 @@
1-
// LeetCode 370. Range Addition
2-
31
class Solution {
42
class SegTreeNode
53
{
64
public:
75
SegTreeNode* left;
86
SegTreeNode* right;
97
int start, end;
10-
int info;
8+
int info;
119
int tag;
1210
SegTreeNode(int a, int b):start(a),end(b),info(0),tag(0),left(NULL),right(NULL){}
1311
};
@@ -28,74 +26,76 @@ class Solution {
2826
init(node->left, a, mid);
2927
init(node->right, mid+1, b);
3028

31-
node->info = node->left->info + node->right->info; // write your own logic
29+
node->info = 0; // write your own logic
3230
}
3331

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)
32+
void updateRange(SegTreeNode* node, int a, int b, int val)
33+
{
34+
if (b < node->start || a > node->end )
35+
return;
36+
if (a <= node->start && b>=node->end)
3837
{
39-
// write your own logic
40-
node->info += val * len(node);
41-
node->tag += val;
38+
node->info += val * (node->end-node->start+1);
39+
node->tag += val;
4240
return;
4341
}
4442

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
43+
pushdown(node); // erase lazy tag and propagate down
44+
updateRange(node->left, a, b, val);
45+
updateRange(node->right, a, b, val);
5046
}
5147

52-
int len(SegTreeNode* node)
48+
void pushdown(SegTreeNode* node)
5349
{
54-
return node->end - node->start + 1;
55-
}
56-
57-
void pushDown(SegTreeNode* node)
58-
{
59-
if (node->tag!=0)
50+
if (node->tag != 0)
6051
{
61-
node->left->info += len(node->left) * node->tag;
62-
node->right->info += len(node->right) * node->tag;
6352
node->left->tag += node->tag;
6453
node->right->tag += node->tag;
65-
node->tag = 0;
66-
}
67-
}
54+
node->left->info += node->tag * (node->left->end-node->left->start+1);
55+
node->right->info += node->tag * (node->right->end-node->right->start+1);
56+
node->tag = 0;
57+
}
58+
}
6859

69-
int queryRange(SegTreeNode* node, int a, int b)
60+
int querySingle(SegTreeNode* node, int id)
7061
{
71-
if (b < node->start || a > node->end )
62+
if (id < node->start || id > node->end )
7263
{
73-
return 0; // write your own logic
64+
return INT_MAX; // write your own logic
7465
}
75-
if (a <= node->start && b>=node->end)
66+
if (node->start==id && node->end==id)
7667
{
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-
}
68+
return node->info;
69+
}
70+
71+
pushdown(node);
72+
int a = querySingle(node->left, id);
73+
int b = querySingle(node->right, id);
74+
if (a!=INT_MAX) return a;
75+
else if (b!=INT_MAX) return b;
76+
else return INT_MAX;
77+
}
78+
8279

83-
SegTreeNode* root;
8480

8581
public:
8682
vector<int> getModifiedArray(int length, vector<vector<int>>& updates)
8783
{
8884
SegTreeNode* root = new SegTreeNode(0, length-1);
89-
9085
init(root, 0, length-1);
91-
92-
for (auto& update: updates)
86+
87+
for (auto update: updates)
9388
{
94-
updateRangeBy(root, update[0], update[1], update[2]);
89+
updateRange(root, update[0], update[1], update[2]);
9590
}
91+
9692
vector<int>rets(length);
9793
for (int i=0; i<length; i++)
98-
rets[i] = queryRange(root, i, i);
94+
{
95+
rets[i] = querySingle(root, i);
96+
}
97+
9998
return rets;
10099
}
101100
};
101+

0 commit comments

Comments
 (0)