// 
//  main.cpp 
//  Segment Tree 
// 
//  Created by Himanshu on 22/08/21. 
// 
 
#include <iostream> 
#include <math.h> 
using  namespace  std; 
 
const  int  N =  6 ; 
int  seg[ 2 * N- 1 ] ; 
 
int  construct ( int  arr[ ] , int  sb, int  se, int  si)  { 
    if  ( sb ==  se)  { 
        seg[ si]  =  arr[ sb] ; 
    }  else  { 
      int  mid =  ( sb +  se) / 2 ; 
      seg[ si]  =  construct( arr, sb, mid, 2 * si +  1 )  + 
  construct( arr, mid+ 1 , se, 2 * si +  2 ) ; 
   } 
    return  seg[ si] ; 
} 
 
int  getSum( int  sb, int  se, int  x, int  y, int  i)  { 
    if  ( sb >  y ||  se <  x)  { 
       return  0 ; 
    }  else  if  ( sb >=  x &&  se <=  y)  { 
       return  seg[ i] ; 
    }  else  { 
       int  mid =  ( sb+ se) / 2 ; 
       return  getSum( sb, mid, x, y, 2 * i +  1 )  +  getSum( mid+ 1 , se, x, y, 2 * i +  2 ) ; 
    } 
} 
 
void  update ( int  sb, int  se, int  idx, int  diff, int  i)  { 
  if  ( idx <  sb ||  idx >  se)  { 
    return ; 
  } 
  seg[ i]  + =  diff; 
  if  ( sb ! =  se)  { 
    int  mid =  ( sb+ se) / 2 ; 
    update( sb, mid, idx, diff, ( 2 * i +  1 ) ) ; 
    update( mid+ 1 , se, idx, diff, ( 2 * i +  2 ) ) ; 
  } 
} 
 
int  main( )  { 
    int  arr[ ]  =  { 1 , 3 , 2 , 7 , 9 , 11 } ; 
 
    // Constructing segment tree (preprocessing) 
    construct( arr, 0 , N- 1 , 0 ) ; 
 
    // Print minimum value in arr[qs..qe] 
    cout << "Sum in the range:" << endl; 
    cout << "x = 0, y = 2: " << getSum( 0 , N- 1 , 0 , 2 , 0 ) << endl; 
    cout << "x = 3, y = 4: " << getSum( 0 , N- 1 , 3 , 4 , 0 ) << endl; 
    cout << "Update index 3, from 7 to 1" << endl; 
    int  diff =  1  -  arr[ 3 ] ; 
    update( 0 , N- 1 , 3 , diff, 0 ) ; 
    cout << "x = 2, y = 5: " << getSum( 0 , N- 1 , 2 , 5 , 0 ) << endl; 
    cout << "Update index 5, from 11 to 2" << endl; 
    diff =  2  -  arr[ 5 ] ; 
    update( 0 , N- 1 , 5 , diff, 0 ) ; 
    cout << "x = 3, y = 5: " << getSum( 0 , N- 1 , 3 , 5 , 0 ) << endl; 
    cout << "x = 0, y = 5: " << getSum( 0 , N- 1 , 0 , 5 , 0 ) << endl; 
 
    return  0 ; 
} 
 
 
				Ly8KLy8gIG1haW4uY3BwCi8vICBTZWdtZW50IFRyZWUKLy8KLy8gIENyZWF0ZWQgYnkgSGltYW5zaHUgb24gMjIvMDgvMjEuCi8vCgojaW5jbHVkZSA8aW9zdHJlYW0+CiNpbmNsdWRlIDxtYXRoLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgpjb25zdCBpbnQgTiA9IDY7CmludCBzZWdbMipOLTFdOwoKaW50IGNvbnN0cnVjdCAoaW50IGFycltdLCBpbnQgc2IsIGludCBzZSwgaW50IHNpKSB7CiAgICBpZiAoc2IgPT0gc2UpIHsKICAgICAgICBzZWdbc2ldID0gYXJyW3NiXTsKICAgIH0gZWxzZSB7CiAgICAgIGludCBtaWQgPSAoc2IgKyBzZSkvMjsKICAgICAgc2VnW3NpXSA9IGNvbnN0cnVjdChhcnIsIHNiLCBtaWQsIDIqc2kgKyAxKSArCiAgY29uc3RydWN0KGFyciwgbWlkKzEsIHNlLCAyKnNpICsgMik7CiAgIH0KICAgIHJldHVybiBzZWdbc2ldOwp9CgppbnQgZ2V0U3VtKGludCBzYiwgaW50IHNlLCBpbnQgeCwgaW50IHksIGludCBpKSB7CiAgICBpZiAoc2IgPiB5IHx8IHNlIDwgeCkgewogICAgICAgcmV0dXJuIDA7CiAgICB9IGVsc2UgaWYgKHNiID49IHggJiYgc2UgPD0geSkgewogICAgICAgcmV0dXJuIHNlZ1tpXTsKICAgIH0gZWxzZSB7CiAgICAgICBpbnQgbWlkID0gKHNiK3NlKS8yOwogICAgICAgcmV0dXJuIGdldFN1bShzYiwgbWlkLCB4LCB5LCAyKmkgKyAxKSArIGdldFN1bShtaWQrMSwgc2UsIHgsIHksIDIqaSArIDIpOwogICAgfQp9Cgp2b2lkIHVwZGF0ZSAoaW50IHNiLCBpbnQgc2UsIGludCBpZHgsIGludCBkaWZmLCBpbnQgaSkgewogIGlmIChpZHggPCBzYiB8fCBpZHggPiBzZSkgewogICAgcmV0dXJuOwogIH0KICBzZWdbaV0gKz0gZGlmZjsKICBpZiAoc2IgIT0gc2UpIHsKICAgIGludCBtaWQgPSAoc2Irc2UpLzI7CiAgICB1cGRhdGUoc2IsIG1pZCwgaWR4LCBkaWZmLCAoMippICsgMSkpOwogICAgdXBkYXRlKG1pZCsxLCBzZSwgaWR4LCBkaWZmLCAoMippICsgMikpOwogIH0KfQoKaW50IG1haW4oKSB7CiAgICBpbnQgYXJyW10gPSB7MSwgMywgMiwgNywgOSwgMTF9OwogICAgCiAgICAvLyBDb25zdHJ1Y3Rpbmcgc2VnbWVudCB0cmVlIChwcmVwcm9jZXNzaW5nKQogICAgY29uc3RydWN0KGFyciwgMCwgTi0xLCAwKTsKCiAgICAvLyBQcmludCBtaW5pbXVtIHZhbHVlIGluIGFycltxcy4ucWVdCiAgICBjb3V0PDwiU3VtIGluIHRoZSByYW5nZToiPDxlbmRsOwogICAgY291dDw8InggPSAwLCB5ID0gMjogIjw8Z2V0U3VtKDAsIE4tMSwgMCwgMiwgMCk8PGVuZGw7CiAgICBjb3V0PDwieCA9IDMsIHkgPSA0OiAiPDxnZXRTdW0oMCwgTi0xLCAzLCA0LCAwKTw8ZW5kbDsKICAgIGNvdXQ8PCJVcGRhdGUgaW5kZXggMywgZnJvbSA3IHRvIDEiPDxlbmRsOwogICAgaW50IGRpZmYgPSAxIC0gYXJyWzNdOwogICAgdXBkYXRlKDAsIE4tMSwgMywgZGlmZiwgMCk7CiAgICBjb3V0PDwieCA9IDIsIHkgPSA1OiAiPDxnZXRTdW0oMCwgTi0xLCAyLCA1LCAwKTw8ZW5kbDsKICAgIGNvdXQ8PCJVcGRhdGUgaW5kZXggNSwgZnJvbSAxMSB0byAyIjw8ZW5kbDsKICAgIGRpZmYgPSAyIC0gYXJyWzVdOwogICAgdXBkYXRlKDAsIE4tMSwgNSwgZGlmZiwgMCk7CiAgICBjb3V0PDwieCA9IDMsIHkgPSA1OiAiPDxnZXRTdW0oMCwgTi0xLCAzLCA1LCAwKTw8ZW5kbDsKICAgIGNvdXQ8PCJ4ID0gMCwgeSA9IDU6ICI8PGdldFN1bSgwLCBOLTEsIDAsIDUsIDApPDxlbmRsOwogICAgCiAgICByZXR1cm4gMDsKfQo=