http://www.lintcode.com/zh-cn/problem/interval-sum/
/**
* 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
*/
vector<long long> intervalSum(vector<int> &A, vector<Interval> &queries) {
// write your code here
SegmentTreeNode * root = build(0, A.size() - 1, A);
vector<long long> d;
for (int i = 0; i<queries.size(); i++){
d.push_back(query(root, queries[i].start, queries[i].end));
}
return d;
}
SegmentTreeNode * build(int start, int end, vector<int> &A) {
// write your code here
if (start>end)return NULL;
int mid = start + (end - start) / 2;
if (start == end)return new SegmentTreeNode(start, end, A[start] );
SegmentTreeNode *left = build(start, mid, A);
SegmentTreeNode *right = build(mid + 1, end, A);
SegmentTreeNode *stn = new SegmentTreeNode(start, end, left->max + right->max);
stn->left = left;
stn->right = right;
return stn;
}
unsigned int query(SegmentTreeNode *root, int start, int end) {
// write your code here
if (root == nullptr)return 0;
SegmentTreeNode *left = root->left, *right = root->right;
if (end<root->start)return 0;//end超出了最左
if (start>root->end)return 0;//start超出了最右
if (start<root->start)start = left->start;//start超出了最左
if (end>root->end)end = right->end;//end超出了最右
if (start == root->start&&end == root->end)return root->max;
if (left->end >= end){//完全左侧
return query(left, start, end);
}
if (right->start <= start){//完全右侧
return query(right, start, end);
}
return query(left, start, left->end)+query(right, right->start, end);//左右之间都有
}
};