//
// main.cpp
// Segment Tree
//
// Created by Himanshu on 22/08/21.
//
#include <iostream>
#include <math.h>
#include <climits>
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] = min( ( construct( arr, sb, mid, 2 * si + 1 ) ) ,
( construct( arr, mid+ 1 , se, 2 * si + 2 ) ) ) ;
}
return seg[ si] ;
}
int getMin( int sb, int se, int p, int q, int i) {
if ( sb > p || se < q) {
return INT_MAX ;
} else if ( sb >= p && se <= q) {
return seg[ i] ;
} else {
int mid = ( sb+ se) / 2 ;
return min( ( getMin( sb, mid, p, q, 2 * i + 1 ) ) ,
( getMin( mid+ 1 , se, p, q, 2 * i + 2 ) ) ) ;
}
}
void update ( int arr[ ] , int sb, int se, int idx, int val, int i) {
//Base case: index not in the range
if ( idx < sb || idx > se) {
return ;
} //index to be changed
else if ( sb == se) {
arr[ idx] = val;
seg[ i] = val;
} else {
int mid = ( sb+ se) / 2 ;
if ( idx >= sb && idx <= mid) {
update( arr, sb, mid, idx, val, 2 * i + 1 ) ;
} else {
update( arr, mid+ 1 , se, idx, val, 2 * i + 2 ) ;
}
seg[ i] = min( seg[ 2 * i + 1 ] , seg[ 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 << "Minimum element in the range:" << endl;
cout << "p = 1, q = 5: " << getMin( 0 , N- 1 , 1 , 5 , 0 ) << endl;
cout << "p = 0, q = 3: " << getMin( 0 , N- 1 , 0 , 3 , 0 ) << endl;
cout << "Update index 3, from 7 to 1" << endl;
update( arr, 0 , N- 1 , 3 , 1 , 0 ) ;
cout << "p = 2, q = 5: " << getMin( 0 , N- 1 , 2 , 5 , 0 ) << endl;
cout << "Update index 0, from 1 to 5" << endl;
update( arr, 0 , N- 1 , 0 , 5 , 0 ) ;
cout << "p = 0, q = 2: " << getMin( 0 , N- 1 , 0 , 2 , 0 ) << endl;
return 0 ;
}
Ly8KLy8gIG1haW4uY3BwCi8vICBTZWdtZW50IFRyZWUKLy8KLy8gIENyZWF0ZWQgYnkgSGltYW5zaHUgb24gMjIvMDgvMjEuCi8vCgojaW5jbHVkZSA8aW9zdHJlYW0+CiNpbmNsdWRlIDxtYXRoLmg+CiNpbmNsdWRlIDxjbGltaXRzPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKY29uc3QgaW50IE4gPSA2OwppbnQgc2VnWzIqTi0xXTsKCmludCBjb25zdHJ1Y3QgKGludCBhcnJbXSwgaW50IHNiLCBpbnQgc2UsIGludCBzaSkgewogIGlmIChzYiA9PSBzZSkgewogICAgICBzZWdbc2ldID0gYXJyW3NiXTsKICB9IGVsc2UgewogICAgaW50IG1pZCA9IChzYitzZSkvMjsKICAgIHNlZ1tzaV0gPSBtaW4oKGNvbnN0cnVjdChhcnIsIHNiLCBtaWQsIDIqc2kgKyAxKSksCihjb25zdHJ1Y3QoYXJyLCBtaWQrMSwgc2UsIDIqc2kgKyAyKSkpOwogfQogIHJldHVybiBzZWdbc2ldOwp9CgppbnQgZ2V0TWluKGludCBzYiwgaW50IHNlLCBpbnQgcCwgaW50IHEsIGludCBpKSB7CiBpZiAoc2IgPiBwIHx8IHNlIDwgcSkgewogICByZXR1cm4gSU5UX01BWDsKIH0gZWxzZSBpZiAoc2IgPj0gcCAmJiBzZSA8PSBxKSB7CiAgIHJldHVybiBzZWdbaV07CiB9IGVsc2UgewogICBpbnQgbWlkID0gKHNiK3NlKS8yOwogICByZXR1cm4gbWluKChnZXRNaW4oc2IsIG1pZCwgcCwgcSwgMippICsgMSkpLAooZ2V0TWluKG1pZCsxLCBzZSwgcCwgcSwgMippICsgMikpKTsKIH0KfQoKdm9pZCB1cGRhdGUgKGludCBhcnJbXSwgaW50IHNiLCBpbnQgc2UsIGludCBpZHgsIGludCB2YWwsIGludCBpKSB7CiAgLy9CYXNlIGNhc2U6IGluZGV4IG5vdCBpbiB0aGUgcmFuZ2UKICBpZiAoaWR4IDwgc2IgfHwgaWR4ID4gc2UpIHsKICAgIHJldHVybjsKICB9IC8vaW5kZXggdG8gYmUgY2hhbmdlZAogICAgZWxzZSBpZiAoc2IgPT0gc2UpIHsKICAgIGFycltpZHhdID0gdmFsOwogICAgc2VnW2ldID0gdmFsOwogIH0gZWxzZSB7CiAgICBpbnQgbWlkID0gKHNiK3NlKS8yOwogICAgaWYgKGlkeCA+PSBzYiAmJiBpZHggPD0gbWlkKSB7IAogICAgICB1cGRhdGUoYXJyLCBzYiwgbWlkLCBpZHgsIHZhbCwgMippICsgMSk7CiAgICB9IGVsc2UgewogICAgICB1cGRhdGUoYXJyLCBtaWQrMSwgc2UsIGlkeCwgdmFsLCAyKmkgKyAyKTsgCiAgICB9IAogICBzZWdbaV0gPSBtaW4oc2VnWzIqaSArIDFdLCBzZWdbMippICsgMl0pOwogIH0KfQoKaW50IG1haW4oKSB7CiAgICBpbnQgYXJyW10gPSB7MSwgMywgMiwgNywgOSwgMTF9OwogICAgCiAgICAvLyBDb25zdHJ1Y3Rpbmcgc2VnbWVudCB0cmVlIChwcmVwcm9jZXNzaW5nKQogICAgY29uc3RydWN0KGFyciwgMCwgTi0xLCAwKTsKCiAgICAvLyBQcmludCBtaW5pbXVtIHZhbHVlIGluIGFycltxcy4ucWVdCiAgICBjb3V0PDwiTWluaW11bSBlbGVtZW50IGluIHRoZSByYW5nZToiPDxlbmRsOwogICAgY291dDw8InAgPSAxLCBxID0gNTogIjw8Z2V0TWluKDAsIE4tMSwgMSwgNSwgMCk8PGVuZGw7CiAgICBjb3V0PDwicCA9IDAsIHEgPSAzOiAiPDxnZXRNaW4oMCwgTi0xLCAwLCAzLCAwKTw8ZW5kbDsKICAgIGNvdXQ8PCJVcGRhdGUgaW5kZXggMywgZnJvbSA3IHRvIDEiPDxlbmRsOwogICAgdXBkYXRlKGFyciwgMCwgTi0xLCAzLCAxLCAwKTsKICAgIGNvdXQ8PCJwID0gMiwgcSA9IDU6ICI8PGdldE1pbigwLCBOLTEsIDIsIDUsIDApPDxlbmRsOwogICAgY291dDw8IlVwZGF0ZSBpbmRleCAwLCBmcm9tIDEgdG8gNSI8PGVuZGw7CiAgICB1cGRhdGUoYXJyLCAwLCBOLTEsIDAsIDUsIDApOwogICAgY291dDw8InAgPSAwLCBxID0gMjogIjw8Z2V0TWluKDAsIE4tMSwgMCwgMiwgMCk8PGVuZGw7CiAgICAKICAgIHJldHVybiAwOwp9Cg==