package info.frady.real;
import java.util.Map;
public class RMQ {
static int[][] st_MAX;//最大值
static int[][] st_MIN;//最小值
public static void main(String[] args) {
int[] arrT=new int[]{0,1,2,3,4,5,6};
RMQ_MAX(arrT);
RMQ_MIN(arrT);
System.out.println(query_MAX(0,1));
System.out.println(query_MAX(0,3));
System.out.println(query_MAX(2,5));
System.out.println(query_MIN(0,1));
System.out.println(query_MIN(0,3));
System.out.println(query_MIN(2,5));
}
public static void RMQ_MAX(int[] nus){
int n = nus.length;
st_MAX = new int[n][(int)(Math.log(n + 1) / Math.log(2)) + 1];
RMQInit_MAX(nus);
}
private static void RMQInit_MAX(int[] nus){
int n = nus.length;
for(int i = 0; i < n; i++) st_MAX[i][0] = nus[i];
for(int j = 1; (1 << j) <= n; j++){
for(int i = 0; i + (1 << j) - 1 < n; i++){
st_MAX[i][j] = Math.max(st_MAX[i][j - 1], st_MAX[i + (1 << (j - 1) )][j - 1]);
}
}
}
public static int query_MAX(int u, int v){
return RMQQuery_MAX(u, v);
}
private static int RMQQuery_MAX(int u, int v){
int k = (int) (Math.log(v - u + 1) / Math.log(2));
return Math.max(st_MAX[u][k], st_MAX[v - (1 << k) + 1][k]);
}
public static void RMQ_MIN(int[] nus){
int n = nus.length;
st_MIN = new int[n][(int)(Math.log(n + 1) / Math.log(2)) + 1];
RMQInit_MIN(nus);
}
private static void RMQInit_MIN(int[] nus){
int n = nus.length;
for(int i = 0; i < n; i++) st_MIN[i][0] = nus[i];
for(int j = 1; (1 << j) <= n; j++){
for(int i = 0; i + (1 << j) - 1 < n; i++){
st_MIN[i][j] = Math.min(st_MIN[i][j - 1], st_MIN[i + (1 << (j - 1) )][j - 1]);
}
}
}
public static int query_MIN(int u, int v){
return RMQQuery_MIN(u, v);
}
private static int RMQQuery_MIN(int u, int v){
int k = (int) (Math.log(v - u + 1) / Math.log(2));
return Math.min(st_MIN[u][k], st_MIN[v - (1 << k) + 1][k]);
}
}