1- // LeetCode 370. Range Addition
2-
31class 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
8581public:
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