From 273b08f6fcb8cffec6cbb0bb8f5835aced9b464d Mon Sep 17 00:00:00 2001 From: rohan17088 <44478017+rohan17088@users.noreply.github.com> Date: Wed, 2 Oct 2019 18:30:34 +0530 Subject: [PATCH] Code For Merge_Sort_Tree added --- data_structures/trees/MergeSortTree.cpp | 104 ++++++++++++++++++++++++ 1 file changed, 104 insertions(+) create mode 100644 data_structures/trees/MergeSortTree.cpp diff --git a/data_structures/trees/MergeSortTree.cpp b/data_structures/trees/MergeSortTree.cpp new file mode 100644 index 0000000..95fe9d8 --- /dev/null +++ b/data_structures/trees/MergeSortTree.cpp @@ -0,0 +1,104 @@ +// C++ program to count number of smaller or +// equal to given number and given row range. +#include +using namespace std; + +const int MAX = 1000; + +// Constructs a segment tree and stores sTree[] +void buildTree(int idx, int ss, int se, vector a[], + vector sTree[]) +{ + /*leaf node*/ + if (ss == se) + { + sTree[idx] = a[ss]; + return; + } + + int mid = (ss+se)/2; + + /* building left subtree */ + buildTree(2*idx+1, ss, mid, a, sTree); + + /* building right subtree */ + buildTree(2*idx+2, mid+1, se, a, sTree); + + /* merging left and right child in sorted order */ + merge(sTree[2*idx+1].begin(), sTree[2*idx+1].end(), + sTree[2*idx+2].begin(), sTree[2*idx+2].end(), + back_inserter(sTree[idx])); +} + +// Recursive function to count smaller elements from row +// a[ss] to a[se] and value smaller than or equal to k. +int queryRec(int node, int start, int end, int ss, int se, + int k, vector a[], vector sTree[]) +{ + /* If out of range return 0 */ + if (ss > end || start > se) + return 0; + + /* if inside the range return count */ + if (ss <= start && se >= end) + { + /* binary search over the sorted vector + to return count >= X */ + return upper_bound(sTree[node].begin(), + sTree[node].end(), k) - + sTree[node].begin(); + } + + int mid = (start+end)/2; + + /*searching in left subtree*/ + int p1 = queryRec(2*node+1, start, mid, ss, se, k, a, sTree); + + /*searching in right subtree*/ + int p2 = queryRec(2*node+2, mid+1, end, ss, se, k, a, sTree); + + /*adding both the result*/ + return p1 + p2; +} + +// A wrapper over query(). +int query(int start, int end, int k, vector a[], int n, + vector sTree[]) +{ +return queryRec(0, 0, n-1, start, end, k, a, sTree); +} + +// Driver code +int main() +{ + int n = 3; + int arr[][3] = { {2, 4, 5}, + {3, 4, 9}, + {6, 8, 10}}; + + // build an array of vectos from above input + vector a[n]; + for (int i=0; i sTree[MAX]; + buildTree(0, 0, n-1, a, sTree); + + /* un-comment to print merge sort tree*/ + /*for (int i=0;i<2*n-1;i++) + { + cout << i << " "; + for (int j=0;j