From 7857f08dadd966f6ccb5da918e4258902ae8f64e Mon Sep 17 00:00:00 2001 From: wisdompeak Date: Wed, 25 Jul 2018 16:21:44 -0700 Subject: [PATCH] Create 370.Range-Addition.cpp --- .../370.Range-Addition/370.Range-Addition.cpp | 76 +++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 Segment_Tree/370.Range-Addition/370.Range-Addition.cpp diff --git a/Segment_Tree/370.Range-Addition/370.Range-Addition.cpp b/Segment_Tree/370.Range-Addition/370.Range-Addition.cpp new file mode 100644 index 000000000..68056a533 --- /dev/null +++ b/Segment_Tree/370.Range-Addition/370.Range-Addition.cpp @@ -0,0 +1,76 @@ +class Solution { + class SegNode + { + public: + + int begin, end, status; + SegNode* left; + SegNode* right; + SegNode(int a, int b, int s) + { + begin = a; + end = b; + status = s; + left = NULL; + right = NULL; + } + + void remove(SegNode* & node) + { + if (node==NULL) return; + remove(node->left); + remove(node->right); + delete node; + node=NULL; + } + + int setStatus(int a, int b, int s) + { + if (b<=begin || a>=end) + { + return status; + } + if (a<=begin && end<=b && left==NULL) + { + status += s; + return status; + } + int mid = (end-begin)/2+begin; + if (left==NULL) + { + left = new SegNode(begin,mid,status); + right = new SegNode(mid,end,status); + } + int leftStatus = left->setStatus(a,b,s); + int rightStatus = right->setStatus(a,b,s); + return max(leftStatus,rightStatus); + } + }; + +public: + vector getModifiedArray(int length, vector>& updates) + { + SegNode* root = new SegNode(0,length,0); + + for (int i=0; isetStatus(updates[i][0],updates[i][1]+1,updates[i][2]); + + vectorresults(length); + DFS(root,results); + return results; + } + + void DFS(SegNode* node, vector& results) + { + if (node==NULL) + return; + if (node->left!=NULL) + { + DFS(node->left,results); + DFS(node->right,results); + return; + } + for (int i=node->begin; iend; i++) + results[i] = node->status; + } +};