//
// 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) {
//Base case (only 1 element)
if (sb == se) {
seg[si] = arr[sb];
} else {
int mid = (sb+se)/2;
seg[si] = max((construct(arr, sb, mid, 2*si + 1)),
(construct(arr, mid+1, se, 2*si + 2)));
}
return seg[si];
}
int getMax(int sb, int se, int p, int q, int i) {
//Base case: Out of bound range
if (sb > q || se < p) {
return INT_MIN;
} else if (sb >= p && se <= q) {
return seg[i];
} else {
int mid = (sb+se)/2;
return max((getMax(sb, mid, p, q, 2*i + 1)),
(getMax(mid+1, se, p, q, 2*i + 2)));
}
}
int main() {
int arr[] = {1, 3, 2, 7, 9, 11};
// Constructing segment tree (preprocessing)
construct(arr, 0, N-1, 0);
// Print maximum value in arr[qs..qe]
cout<<"Maximum element in the range:"<<endl;
cout<<"p = 1, q = 5: "<<getMax(0, N-1, 1, 5, 0)<<endl;
cout<<"p = 0, q = 3: "<<getMax(0, N-1, 0, 3, 0)<<endl;
cout<<"p = 3, q = 5: "<<getMax(0, N-1, 3, 5, 0)<<endl;
cout<<"p = 0, q = 4: "<<getMax(0, N-1, 0, 4, 0)<<endl;
return 0;
}
Ly8KLy8gIG1haW4uY3BwCi8vICBTZWdtZW50IFRyZWUKLy8KLy8gIENyZWF0ZWQgYnkgSGltYW5zaHUgb24gMjIvMDgvMjEuCi8vCgojaW5jbHVkZSA8aW9zdHJlYW0+CiNpbmNsdWRlIDxtYXRoLmg+CiNpbmNsdWRlIDxjbGltaXRzPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKY29uc3QgaW50IE4gPSA2OwppbnQgc2VnWzIqTi0xXTsKCmludCBjb25zdHJ1Y3QgKGludCBhcnJbXSwgaW50IHNiLCBpbnQgc2UsIGludCBzaSkgewoKICAvL0Jhc2UgY2FzZSAob25seSAxIGVsZW1lbnQpCiAgaWYgKHNiID09IHNlKSB7CiAgICBzZWdbc2ldID0gYXJyW3NiXTsKICB9IGVsc2UgewogICAgaW50IG1pZCA9IChzYitzZSkvMjsgIAogICAgc2VnW3NpXSA9IG1heCgoY29uc3RydWN0KGFyciwgc2IsIG1pZCwgMipzaSArIDEpKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdHJ1Y3QoYXJyLCBtaWQrMSwgc2UsIDIqc2kgKyAyKSkpOwogIH0KCiAgcmV0dXJuIHNlZ1tzaV07Cn0KCmludCBnZXRNYXgoaW50IHNiLCBpbnQgc2UsIGludCBwLCBpbnQgcSwgaW50IGkpIHsKCiAvL0Jhc2UgY2FzZTogT3V0IG9mIGJvdW5kIHJhbmdlCiBpZiAoc2IgPiBxIHx8IHNlIDwgcCkgewogICByZXR1cm4gSU5UX01JTjsKIH0gZWxzZSBpZiAoc2IgPj0gcCAmJiBzZSA8PSBxKSB7CiAgIHJldHVybiBzZWdbaV07IAogfSBlbHNlIHsKICAgaW50IG1pZCA9IChzYitzZSkvMjsKICAgcmV0dXJuIG1heCgoZ2V0TWF4KHNiLCBtaWQsIHAsIHEsIDIqaSArIDEpKSwgIAogICAgICAgICAgICAgIChnZXRNYXgobWlkKzEsIHNlLCBwLCBxLCAyKmkgKyAyKSkpOwogfQoKfQoKaW50IG1haW4oKSB7CiAgICBpbnQgYXJyW10gPSB7MSwgMywgMiwgNywgOSwgMTF9OwogICAgCiAgICAvLyBDb25zdHJ1Y3Rpbmcgc2VnbWVudCB0cmVlIChwcmVwcm9jZXNzaW5nKQogICAgY29uc3RydWN0KGFyciwgMCwgTi0xLCAwKTsKCiAgICAvLyBQcmludCBtYXhpbXVtIHZhbHVlIGluIGFycltxcy4ucWVdCiAgICBjb3V0PDwiTWF4aW11bSBlbGVtZW50IGluIHRoZSByYW5nZToiPDxlbmRsOwogICAgY291dDw8InAgPSAxLCBxID0gNTogIjw8Z2V0TWF4KDAsIE4tMSwgMSwgNSwgMCk8PGVuZGw7CiAgICBjb3V0PDwicCA9IDAsIHEgPSAzOiAiPDxnZXRNYXgoMCwgTi0xLCAwLCAzLCAwKTw8ZW5kbDsKICAgIGNvdXQ8PCJwID0gMywgcSA9IDU6ICI8PGdldE1heCgwLCBOLTEsIDMsIDUsIDApPDxlbmRsOwogICAgY291dDw8InAgPSAwLCBxID0gNDogIjw8Z2V0TWF4KDAsIE4tMSwgMCwgNCwgMCk8PGVuZGw7CiAgICAKICAgIHJldHVybiAwOwp9Cg==