Get Min from a subarray
import java.util.*;
public class GetMIN {
public static int tree[];
public static void init(int n) {
tree = new int[4 * n];
}
public static void Construct(int arr[], int i, int start, int end) {
if (start == end) {
tree[i] = arr[start];
return;
}
int mid = (start + end) / 2;
Construct(arr, 2 * i + 1, start, mid);
Construct(arr, 2 * i + 2, mid + 1, end);
tree[i] = Math.min(tree[2 * i + 1], tree[2 * i + 2]);
}
public static void Print() {
for (int i = 0; i < tree.length; i++) {
System.out.print(tree[i] + " ");
}
System.out.println();
}
public static int getMin(int arr[], int i, int si, int sj, int qi, int qj, int n) {
if (si > qj || sj < qi) {
return Integer.MAX_VALUE;
} else if (si >= qi && sj <= qj) {
return tree[i];
} else {
int mid = (si + sj) / 2;
int left = getMin(arr, 2 * i + 1, si, mid, qi, qj, n);
int right = getMin(arr, 2 * i + 2, mid + 1, sj, qi, qj, n);
return Math.min(left, right);
}
}
public static void Update(int arr[], int idx, int newVal, int n) {
arr[idx] = newVal;
UpdateUtil(0, 0, n - 1, idx, newVal);
}
public static void UpdateUtil(int i, int si, int sj, int idx, int newVal) {
if (idx < si || idx > sj) {
return;
}
tree[i] = Math.min(tree[i], newVal);
if (si != sj) {
int mid = (si + sj) / 2;
UpdateUtil(2 * i + 1, si, mid, idx, newVal);
UpdateUtil(2 * i + 2, mid + 1, sj, idx, newVal);
}
}
public static void main(String[] args) {
int arr[] = { 6, 8, -1, 2, 17, 1, 3, 2, 4 };
int n = arr.length;
init(n);
Construct(arr, 0, 0, n - 1);
Print();
System.out.println("The min element:" + getMin(arr, 0, 0, n - 1, 2, 5, n));
Update(arr, 2, -3, n);
Print();
System.out.println("The min element:" + getMin(arr, 0, 0, n - 1, 2, 5, n));
}
}
Comments
Post a Comment