From 43ec0b41b6c5bce6548f293f866f744e8c4a290d Mon Sep 17 00:00:00 2001 From: manish2397 Date: Thu, 26 Sep 2019 22:08:21 +0530 Subject: [PATCH] segment trees questions added --- Segment trees/rangeSumQuery.cpp | 59 ++++++++++++++++++++++++ Segment trees/segmentTrees.cpp | 79 +++++++++++++++++++++++++++++++++ 2 files changed, 138 insertions(+) create mode 100644 Segment trees/rangeSumQuery.cpp create mode 100644 Segment trees/segmentTrees.cpp diff --git a/Segment trees/rangeSumQuery.cpp b/Segment trees/rangeSumQuery.cpp new file mode 100644 index 0000000..7cb9398 --- /dev/null +++ b/Segment trees/rangeSumQuery.cpp @@ -0,0 +1,59 @@ +#include +#define lld long long int +#define ld long int +#define str string +#define dbl double +using namespace std; + + +void buildSegmentTree(int tree[],int values[],int index,int start,int end){ + if(start>end) return; + if(start==end){ + tree[index]=values[start]; + } + else{ + int mid = (start+end)/2; + + //left subTree + buildSegmentTree(tree,values,2*index,start,mid); + //right subTree + buildSegmentTree(tree,values,2*index+1,mid+1,end); + + tree[index] = tree[2*index]+tree[2*index+1]; + } +} + +void updateNode(int tree[],int s,int e,int index,int ind,int val){ + if(inde) return; + else if(s==e){ + tree[index] = val; + return; + } + //left subtree call + int mid = (s+e)/2; + updateNode(tree,s,mid,2*index,ind,val); + updateNode(tree,mid+1,e,2*index+1,ind,val); + tree[index] = tree[2*index]+tree[2*index+1]; + return; +} + +int rangeSumQuery(int tree[],int index,int start,int end,int qStart,int qEnd){ + if(qStart>end or qEnd=end) return tree[index]; + + int mid = (start+end)/2; + int left = rangeSumQuery(tree,2*index,start,mid,qStart,qEnd); + int right = rangeSumQuery(tree,2*index+1,mid+1,end,qStart,qEnd); + return left+right; + +} + +int main(){ + int values[] = {1,3,2,-2,4,5,8,12,10,40}; + int size = sizeof(values)/sizeof(values[0]); + int *segmentTree = new int[4*size+1]; + buildSegmentTree(segmentTree,values,1,0,size-1); + updateNode(segmentTree,0,size-1,1,4,5); + cout< +#define lld long long int +#define ld long int +#define str string +#define dbl double +using namespace std; + +//to update in a given range +void updateRange(int tree[],int s,int e,int index,int qs,int qe,int inc){ + if(s>qe or ee) return; + else if(s==e){ + tree[index] = val; + return; + } + int mid = (s+e)/2; + updateNode(tree,s,mid,2*index,ind,val); + updateNode(tree,mid+1,e,2*index+1,ind,val); + tree[index] = min(tree[2*index],tree[2*index+1]); + return; +} +//building segment tree +void buildSegmentTree(int tree[],int values[],int index,int start,int end){ + if(start>end) return; + if(start==end){ + tree[index]=values[start]; + } + else{ + int mid = (start+end)/2; + + //left subTree + buildSegmentTree(tree,values,2*index,start,mid); + //right subTree + buildSegmentTree(tree,values,2*index+1,mid+1,end); + + tree[index] = min(tree[2*index],tree[2*index+1]); + } +} + +//give minimum element in given range +int minElementQuery(int tree[],int index,int start,int end,int qStart,int qEnd){ + if(qStart>end or qEnd=end) return tree[index]; + + int mid = (start+end)/2; + int left = minElementQuery(tree,2*index,start,mid,qStart,qEnd); + int right = minElementQuery(tree,2*index+1,mid+1,end,qStart,qEnd); + return min(left,right); + +} + +int main(){ + int values[] = {1,3,2,-2,4,5}; + int size = 6; + int *segmentTree = new int[4*size+1]; + buildSegmentTree(segmentTree,values,1,0,size-1); + cout<<"minimum value is : "<