Get Max from a subarray
import java.util.*;
//MAX ELEMENT IN A SUBARRAY
public class GetMAX {
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.max(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 getMax(int arr[], int qi, int qj, int n) {
return getMaxUtil(0, 0, n - 1, qi, qj);
}
public static int getMaxUtil(int i, int si, int sj, int qi, int qj) {
if (si > qj || sj < qi) {
return Integer.MIN_VALUE;
} else if (si >= qi && sj <= qj) {
return tree[i];
} else {
int mid = (si + sj) / 2;
int leftMax = getMaxUtil(2 * i + 1, si, mid, qi, qj);
int rightMax = getMaxUtil(2 * i + 2, mid + 1, sj, qi, qj);
return Math.max(leftMax, rightMax);
}
}
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.max(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, 9, 2, 3, 4 };
int n = arr.length;
init(n);
Construct(arr, 0, 0, n - 1);
Print();
System.out.println("The max element in the subarray: " + getMax(arr, 0, 2, 5));
Update(arr, 2, 20, n);
Print();
System.out.println("The max element in the subarray: " + getMax(arr, 0, 2, 5));
}
}
Comments
Post a Comment