int RMQUtil(int* hist, int* st, int ss, int se, int qs, int qe, int idx) { if (qs <= ss && se <= qe) return st[idx]; if (se < qs || ss > qe) return -1; int mid = midVal(ss, se); return minVal(hist, RMQUtil(hist, st, ss, mid, qs, qe, 2*idx + 1), RMQUtil(hist, st, mid+1, se, qs, qe, 2*idx + 2)); }
int RMQUtil(int *st, int ss, int se, int qs, int qe, int index) { if (qs <= ss && qe >= se) return st[index]; if (se < qs || ss > qe) return INT_MAX; int mid = getMid(ss, se); return minVal(RMQUtil(st, ss, mid, qs, qe, 2*index+1), RMQUtil(st, mid+1, se, qs, qe, 2*index+2)); }
long RMQUtil(long *st,long ss,long se,long qs,long qe,long index){ if(qs<=ss && qe>=se){ return st[index]; } if(se<qs || ss>qe){ return LONG_MAX; } long mid=getMid(ss,se); long a= RMQUtil(st,ss,mid,qs,qe,2*index+1), b=RMQUtil(st,mid+1,se,qs,qe,2*index+2); return minVal(a,b); }
/* A recursive function to get the minimum value in a given range of array indexes. The following are parameters for this function. st --> Pointer to segment tree index --> Index of current node in the segment tree. Initially 0 is passed as root is always at index 0 ss & se --> Starting and ending indexes of the segment represented by current node, i.e., st[index] qs & qe --> Starting and ending indexes of query range */ int RMQUtil(int *st, int ss, int se, int qs, int qe, int index) { // If segment of this node is a part of given range, then return the // min of the segment if (qs <= ss && qe >= se) return st[index]; // If segment of this node is outside the given range if (se < qs || ss > qe) return INT_MAX; // If a part of this segment overlaps with the given range int mid = getMid(ss, se); return minVal(RMQUtil(st, ss, mid, qs, qe, 2*index+1), RMQUtil(st, mid+1, se, qs, qe, 2*index+2)); }
int RMQ(int *st, int n, int qs, int qe) { if (qs < 0 || qe > n-1 || qs > qe) { printf("Invalid Input"); return -1; } return RMQUtil(st, 0, n-1, qs, qe, 0); }
// Return minimum of elements in range from index qs (quey start) to // qe (query end). It mainly uses RMQUtil() int RMQ(int *st, int n, int qs, int qe) { // Check for erroneous input values if (qs < 0 || qe > n-1 || qs > qe) { printf("Invalid Input"); return -1; } return RMQUtil(st, 0, n-1, qs, qe, 0); }
long RMQ(long *st,long n,long qs,long qe){ return RMQUtil(st,0,n-1,qs,qe,0); }
int RMQ(int* hist, int* st, int n, int qs, int qe) { if (qs < 0 || qe > n - 1 || qs > qe) return -1; return RMQUtil(hist, st, 0, n-1, qs, qe, 0); }