// C++ code for segment tree with sum
// range and update query
#include <bits/stdc++.h>
using namespace std;
vector< int > A, ST;
void build( int node, int L, int R)
{
// Leaf node where L == R
if ( L == R) {
cout << "[" << L<< "," << R<< "," << node<< "]\n " ;
ST[ node] = A[ L] ;
}
else {
// Find the middle element to
// split the array into two halves
int mid = ( L + R) / 2 ;
// Recursively travel the
// left half
build( 2 * node, L, mid) ;
// Recursively travel the
// right half
build( 2 * node + 1 , mid + 1 , R) ;
cout << "[" << L<< "," << R<< "," << node<< "]\n " ;
// Storing the sum of both the
// children into the parent
ST[ node] = ST[ 2 * node] + ST[ 2 * node + 1 ] ;
}
}
void update( int node, int L, int R, int idx, int val)
{
// Find the lead node and
// update its value
if ( L == R) {
A[ idx] + = val;
ST[ node] + = val;
}
else {
// Find the mid
int mid = ( L + R) / 2 ;
// If node value idx is at the
// left part then update
// the left part
if ( L <= idx and idx <= mid)
update( 2 * node, L, mid, idx, val) ;
else
update( 2 * node + 1 , mid + 1 , R, idx, val) ;
// Store the information in parents
ST[ node] = ST[ 2 * node] + ST[ 2 * node + 1 ] ;
}
}
int query( int node, int tl, int tr, int l, int r)
{
// If it lies out of range then
// return 0
if ( r < tl or tr < l)
return 0 ;
// If the node contains the range then
// return the node value
if ( l <= tl and tr <= r)
return ST[ node] ;
int tm = ( tl + tr) / 2 ;
// Recursively traverse left and right
// and find the node
return query( 2 * node, tl, tm , l, r)
+ query( 2 * node + 1 , tm + 1 , tr, l, r) ;
}
// Driver code
int main( )
{
int n = 6 ;
A = { 0 , 1 , 3 , 5 , - 2 , 3 } ;
// Create a segment tree of size 4*n
ST.resize ( 4 * n) ;
// Build a segment tree
build( 1 , 0 , n - 1 ) ;
cout << "Sum of values in range 0-4 are: "
<< query( 1 , 0 , n - 1 , 0 , 4 ) << "\n " ;
// Update the value at idx = 1 by
// 100 thus becoming 101
update( 1 , 0 , n - 1 , 1 , 100 ) ;
cout << "Value at index 1 increased by 100\n " ;
cout << "sum of value in range 1-3 are: "
<< query( 1 , 0 , n - 1 , 1 , 3 ) << "\n " ;
return 0 ;
}
Ly8gQysrIGNvZGUgZm9yIHNlZ21lbnQgdHJlZSB3aXRoIHN1bQovLyByYW5nZSBhbmQgdXBkYXRlIHF1ZXJ5CgojaW5jbHVkZSA8Yml0cy9zdGRjKysuaD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKdmVjdG9yPGludD4gQSwgU1Q7Cgp2b2lkIGJ1aWxkKGludCBub2RlLCBpbnQgTCwgaW50IFIpCnsKCiAgICAvLyBMZWFmIG5vZGUgd2hlcmUgTCA9PSBSCiAgICBpZiAoTCA9PSBSKSB7CiAgICAJY291dDw8IlsiPDxMPDwiLCI8PFI8PCIsIjw8bm9kZTw8Il1cbiI7CiAgICAgICAgU1Rbbm9kZV0gPSBBW0xdOwogICAgfQogICAgZWxzZSB7CgogICAgICAgIC8vIEZpbmQgdGhlIG1pZGRsZSBlbGVtZW50IHRvCiAgICAgICAgLy8gc3BsaXQgdGhlIGFycmF5IGludG8gdHdvIGhhbHZlcwogICAgICAgIGludCBtaWQgPSAoTCArIFIpIC8gMjsKCiAgICAgICAgLy8gUmVjdXJzaXZlbHkgdHJhdmVsIHRoZQogICAgICAgIC8vIGxlZnQgaGFsZgogICAgICAgIGJ1aWxkKDIgKiBub2RlLCBMLCBtaWQpOwoKICAgICAgICAvLyBSZWN1cnNpdmVseSB0cmF2ZWwgdGhlCiAgICAgICAgLy8gcmlnaHQgaGFsZgogICAgICAgIGJ1aWxkKDIgKiBub2RlICsgMSwgbWlkICsgMSwgUik7CgoJCWNvdXQ8PCJbIjw8TDw8IiwiPDxSPDwiLCI8PG5vZGU8PCJdXG4iOwogICAgICAgIC8vIFN0b3JpbmcgdGhlIHN1bSBvZiBib3RoIHRoZQogICAgICAgIC8vIGNoaWxkcmVuIGludG8gdGhlIHBhcmVudAogICAgICAgIFNUW25vZGVdID0gU1RbMiAqIG5vZGVdICsgU1RbMiAqIG5vZGUgKyAxXTsKICAgIH0KfQoKdm9pZCB1cGRhdGUoaW50IG5vZGUsIGludCBMLCBpbnQgUiwgaW50IGlkeCwgaW50IHZhbCkKewoKICAgIC8vIEZpbmQgdGhlIGxlYWQgbm9kZSBhbmQKICAgIC8vIHVwZGF0ZSBpdHMgdmFsdWUKICAgIGlmIChMID09IFIpIHsKICAgICAgICBBW2lkeF0gKz0gdmFsOwogICAgICAgIFNUW25vZGVdICs9IHZhbDsKICAgIH0KICAgIGVsc2UgewoKICAgICAgICAvLyBGaW5kIHRoZSBtaWQKICAgICAgICBpbnQgbWlkID0gKEwgKyBSKSAvIDI7CgogICAgICAgIC8vIElmIG5vZGUgdmFsdWUgaWR4IGlzIGF0IHRoZQogICAgICAgIC8vIGxlZnQgcGFydCB0aGVuIHVwZGF0ZQogICAgICAgIC8vIHRoZSBsZWZ0IHBhcnQKICAgICAgICBpZiAoTCA8PSBpZHggYW5kIGlkeCA8PSBtaWQpCiAgICAgICAgICAgIHVwZGF0ZSgyICogbm9kZSwgTCwgbWlkLCBpZHgsIHZhbCk7CiAgICAgICAgZWxzZQogICAgICAgICAgICB1cGRhdGUoMiAqIG5vZGUgKyAxLCBtaWQgKyAxLCBSLCBpZHgsIHZhbCk7CgogICAgICAgIC8vIFN0b3JlIHRoZSBpbmZvcm1hdGlvbiBpbiBwYXJlbnRzCiAgICAgICAgU1Rbbm9kZV0gPSBTVFsyICogbm9kZV0gKyBTVFsyICogbm9kZSArIDFdOwogICAgfQp9CgppbnQgcXVlcnkoaW50IG5vZGUsIGludCB0bCwgaW50IHRyLCBpbnQgbCwgaW50IHIpCnsKCiAgICAvLyBJZiBpdCBsaWVzIG91dCBvZiByYW5nZSB0aGVuCiAgICAvLyByZXR1cm4gMAogICAgaWYgKHIgPCB0bCBvciB0ciA8IGwpCiAgICAgICAgcmV0dXJuIDA7CgogICAgLy8gSWYgdGhlIG5vZGUgY29udGFpbnMgdGhlIHJhbmdlIHRoZW4KICAgIC8vIHJldHVybiB0aGUgbm9kZSB2YWx1ZQogICAgaWYgKGwgPD0gdGwgYW5kIHRyIDw9IHIpCiAgICAgICAgcmV0dXJuIFNUW25vZGVdOwogICAgaW50IHRtID0gKHRsICsgdHIpIC8gMjsKCiAgICAvLyBSZWN1cnNpdmVseSB0cmF2ZXJzZSBsZWZ0IGFuZCByaWdodAogICAgLy8gYW5kIGZpbmQgdGhlIG5vZGUKICAgIHJldHVybiBxdWVyeSgyICogbm9kZSwgdGwsIHRtLCBsLCByKQogICAgICAgICAgICsgcXVlcnkoMiAqIG5vZGUgKyAxLCB0bSArIDEsIHRyLCBsLCByKTsKfQoKLy8gRHJpdmVyIGNvZGUKaW50IG1haW4oKQp7CiAgICBpbnQgbiA9IDY7CiAgICBBID0geyAwLCAxLCAzLCA1LCAtMiwgMyB9OwoKICAgIC8vIENyZWF0ZSBhIHNlZ21lbnQgdHJlZSBvZiBzaXplIDQqbgogICAgU1QucmVzaXplKDQgKiBuKTsKCiAgICAvLyBCdWlsZCBhIHNlZ21lbnQgdHJlZQogICAgYnVpbGQoMSwgMCwgbiAtIDEpOwogICAgY291dCA8PCAiU3VtIG9mIHZhbHVlcyBpbiByYW5nZSAwLTQgYXJlOiAiCiAgICAgICAgIDw8IHF1ZXJ5KDEsIDAsIG4gLSAxLCAwLCA0KSA8PCAiXG4iOwoKICAgIC8vIFVwZGF0ZSB0aGUgdmFsdWUgYXQgaWR4ID0gMSBieQogICAgLy8gMTAwIHRodXMgYmVjb21pbmcgMTAxCiAgICB1cGRhdGUoMSwgMCwgbiAtIDEsIDEsIDEwMCk7CiAgICBjb3V0IDw8ICJWYWx1ZSBhdCBpbmRleCAxIGluY3JlYXNlZCBieSAxMDBcbiI7CiAgICBjb3V0IDw8ICJzdW0gb2YgdmFsdWUgaW4gcmFuZ2UgMS0zIGFyZTogIgogICAgICAgICA8PCBxdWVyeSgxLCAwLCBuIC0gMSwgMSwgMykgPDwgIlxuIjsKCiAgICByZXR1cm4gMDsKfQ==