diff --git a/Range Queries/SegmentTree.cpp b/Range Queries/SegmentTree.cpp new file mode 100644 index 0000000..906bc2e --- /dev/null +++ b/Range Queries/SegmentTree.cpp @@ -0,0 +1,89 @@ +#include + +using namespace std; + +class SegmentTree{ + + + int sz; + vector tree; + +public: + + SegmentTree(const vector& arr){ + + this->sz = arr.size(); + + tree.resize(2*this->sz+1,0); + + init(arr); + + } + + void init(const vector& arr){ + + for(int i = sz-1 ; i >= 0 ; i-- ) + tree[i+sz] = arr[i]; + + for(int i = sz - 1 ; i >= 1 ; i-- ){ + + tree[i] = tree[2*i] + tree[2*i+1]; + + } + + } + + + void print(){ + + cout << "Size : " << sz << '\n'; + + for(int i = 0 ; i <= 2*sz ; i++ ){ + + cout << tree[i] << ' '; + } + cout << '\n'; + } + + int sum( int a, int b){ + + int s = 0; + a += sz , b += sz; + + while( a <= b ){ + + if( a%2 == 1 ) s += tree[a++]; + + if( b%2 == 0 ) s += tree[b--]; + + a /= 2 , b /= 2; + } + return s; + } + + void add(int k, int x) { + k += sz; + tree[k] += x; + for (k /= 2; k >= 1; k /= 2) { + tree[k] = tree[2*k]+tree[2*k+1]; + } +} + + + +}; + +int main(){ + + vector arr = {5,8,6,3,2,7,2,6}; + + SegmentTree stree(arr); + + + stree.print(); + + stree.add(7,1); + cout << "(2,7) : " << stree.sum(2,7) << '\n'; + + return 0; +} \ No newline at end of file