Given an integer array (index from 0 to n-1, where n is the size of this array), and an query list. Each query has two integers
[start, end]. For each query, calculate the minimum number between index start and end in the given array, return the result list.
Example
Segment Tree:
For array
[1,2,7,8,5], and queries [(1,2),(0,4),(2,4)], return [2,1,5]
/**
* Definition of Interval:
* classs Interval {
* int start, end;
* Interval(int start, int end) {
* this->start = start;
* this->end = end;
* }
*/
class Solution {
public:
/**
*@param A, queries: Given an integer array and an query list
*@return: The result list
*/
int query(SegmentTreeNode *root, int start, int end)
{
if(root->start == start && root->end == end) return root->max;
int mid = (root->start+root->end)/2;
if(end <= mid) return query(root->left, start, end);
if(start > mid) return query(root->right, start, end);
if(mid < end) return min(query(root->left, start, mid), query(root->right, mid+1, end));
}
SegmentTreeNode *build(vector<int>&A, int start, int end)
{
if(start>end) return NULL;
if(start == end) return new SegmentTreeNode(start, start, A[start]);
int mid = (start+end)/2;
SegmentTreeNode *left = build(A, start, mid);
SegmentTreeNode *right = build(A, mid+1, end);
SegmentTreeNode *node = new SegmentTreeNode(start, end, min(left->max, right->max));
node->left = left;
node->right = right;
return node;
}
vector<int> intervalMinNumber(vector<int> &A, vector<Interval> &queries) {
// write your code here
vector<int> res;
SegmentTreeNode *root = build(A, 0, A.size()-1);
if(!root) return res;
for(auto e:queries)
{
res.push_back(query(root,e.start, e.end));
}
return res;
}
};