Segment Tree - Min Range Query

'''
#include<bits/stdc++.h>
using namespace std;

void buildTree(int *tree, int *a, int index, int s, int e){

//base case
if(s>e) return;

//base case - leaf node
if(s==e)
{
	tree[index] = a[s];
	return;
}

//recursive case
int mid = (s+e)/2;
buildTree(tree, a, 2*index, s, mid);
buildTree(tree, a, 2*index + 1, mid+1, e);
int left = tree[2*index];
int right = tree[2*index + 1];

tree[index] = min(left, right);

}

int query(int *tree, int index, int s, int e, int qs, int qe){

//No overlap case
if(qs>e || qe<s){
	return INT_MAX;
}
//Complete overlap case
if(s>=qs && e<=qe){
	return tree[index];
}
//Partial Overlap case
int mid = (s+e)/2;
int leftAns = query(tree, 2*index, s, mid, qs, qe);
int rightAns = query(tree, 2*index+1, mid+1, e, qs, qe);
return min(leftAns, rightAns);

}
int main(){

int n;
cin>>n;
int a[n];
for(int i=0;i<n;i++)
cin>>a[i];

//storing segment tree in array
//max size of tree is asssumed to be 4*n + 1
int *tree = new int[4*n+1];
buildTree(tree, a, 1, 0, n-1);

//t -  number of queries
int t;
cin>>t;
while(t--){
	int qs, qe;
	cin>>qs>>qe;
	cout<<"Min value between range is: ";
	cout<<query(tree, 1, 0, n-1, qs, qe)<<endl;
}

}

'''

Comments (0)