public class Solution {
/**
*@param A, queries: Given an integer array and an query list
*@return: The result list
*/
public class segmentTreeNode{
int start;
int end;
int min;
segmentTreeNode left;
segmentTreeNode right;
public segmentTreeNode(int start, int end, int min){
this.start = start;
this.end = end;
this.min = min;
}
}
public segmentTreeNode build(int[] A, int start, int end){
if(start < 0 || end >= A.length || start > end) return null;
if(start == end) {
return new segmentTreeNode(start, end, A[start]);
}
int mid = start + (end - start) / 2;
segmentTreeNode left = build(A, start, mid);
segmentTreeNode right = build(A, mid + 1, end);
segmentTreeNode root = new segmentTreeNode(start, end, Math.min(left.min, right.min));
root.left = left;
root.right = right;
return root;
}
public int queryMin(segmentTreeNode root, int start, int end){
if(start > root.end || end < root.start) return Integer.MAX_VALUE;
start = Math.max(start, root.start);
end = Math.min(end, root.end);
if(start == root.start && end == root.end) return root.min;
int left = queryMin(root.left, start, end);
int right = queryMin(root.right, start, end);
return Math.min(left, right);
}
public ArrayList<Integer> intervalMinNumber(int[] A,
ArrayList<Interval> queries) {
// write your code here
ArrayList<Integer> res = new ArrayList<>();
if(A == null || A.length < 1 || queries == null || queries.size() < 1) return res;
segmentTreeNode root = build(A, 0, A.length - 1);
for(Interval interval : queries){
int start = interval.start;
int end = interval.end;
int min = queryMin(root, start, end);
res.add(min);
}
return res;
}
}