From f0336d40a7dc4be21dc0e0ca2c5ad7c4a475510b Mon Sep 17 00:00:00 2001 From: Ritik Nandwal <48522685+nandwalritik@users.noreply.github.com> Date: Sat, 19 Jun 2021 09:48:45 +0530 Subject: [PATCH] Add iterative implementation of segment trees --- trees/segmentTree/segmentTreeRangeSum.cpp | 57 ++++++++++++++++++++++- 1 file changed, 56 insertions(+), 1 deletion(-) diff --git a/trees/segmentTree/segmentTreeRangeSum.cpp b/trees/segmentTree/segmentTreeRangeSum.cpp index c32dd45..3dcdc1b 100644 --- a/trees/segmentTree/segmentTreeRangeSum.cpp +++ b/trees/segmentTree/segmentTreeRangeSum.cpp @@ -41,8 +41,63 @@ void update(ll parent,ll start,ll end,ll pos,ll val,ll level){ segment_tree[parent] = segment_tree[2*parent+1]^segment_tree[2*parent+2]; return; } +*/ +/* +--------------------------------------ITERATIVE IMPLEMENTATION------------------------------------ +class NumArray { +public: + vector tree; + int n; + NumArray(vector& nums) { + n = nums.size(); + tree.resize(2*n); + buildTree(nums); + } + void buildTree(vector &nums){ + // int n = nums.size(); + for(int i=n,j=0;i<2*n;i++,j++){ + tree[i]=nums[j]; + } + for(int i=n-1;i>0;i--){ + tree[i]=tree[i*2]+tree[i*2+1]; + } + } + void update(int index, int val) { + index+=n; + tree[index]=val; + while(index>0){ + int left = index; + int right=index; + if(index%2 == 0) + right=index+1; + else + left=index-1; + tree[index/2]=tree[left]+tree[right]; + index/=2; + } + } + + int sumRange(int left, int right) { + left+=n; + right+=n; + int sum=0; + while(left<=right){ + if(left%2){ + sum+=tree[left++]; + } + if(right%2 == 0) + { + sum+=tree[right--]; + } + left/=2; + right/=2; + } + return sum; + } +}; */ + struct SegmentTree{ /*Using one based indexing*/ vector tree; @@ -153,4 +208,4 @@ int main(){ return 0; -} \ No newline at end of file +}