/**
* Definition of Interval:
* public classs Interval {
* int start, end;
* Interval(int start, int end) {
* this.start = start;
* this.end = end;
* }
*/
class SegmentTreeNode{
public int start,end;
public long sum;
public SegmentTreeNode right,left;
public SegmentTreeNode(int start,int end){
this.start=start;
this.end=end;
this.sum=0;
this.left=this.right=null;
}
}
public class Solution {
public SegmentTreeNode build(int start,int end,int []A){
if(start>end)
return null;
SegmentTreeNode root= new SegmentTreeNode(start,end);
if(start!=end){
int mid=start+(end-start)/2;
root.left=build(start,mid,A);
root.right=build(mid+1,end,A);
root.sum=root.left.sum+root.right.sum;
}else
root.sum=A[start];
return root;
}
public long query(SegmentTreeNode root,int start,int end){
if(root==null||start>end)
return 0;
if(start<=root.start&&end>=root.end)
return root.sum;
int mid=(root.start+root.end)/2;
if(start>mid)
return query(root.right,start,end);
else if(end<mid+1)
return query(root.left,start,end);
else
return query(root.right,mid+1,end)+query(root.left,start,mid);
}
public ArrayList<Long> intervalSum(int[] A,
ArrayList<Interval> queries) {
ArrayList ans=new ArrayList<Long>();
SegmentTreeNode root=build(0,A.length-1,A);
for(Interval e:queries)
ans.add(query(root,e.start,e.end));
return ans;
}
}