class NumArray {
public:
class segmentTreeNode{
public:
int start,end;
int sum;
segmentTreeNode* left,*right;
segmentTreeNode(int start,int end)
{
this->start=start;
this->end=end;
sum=0;
left=right=NULL;
}
};
segmentTreeNode* build(vector<int>& nums,int s,int e)
{
if(s>e) return NULL;
segmentTreeNode *root=new segmentTreeNode(s,e);
if(s==e) root->sum=nums[s];
else{
int mid=s+(e-s)/2;
root->left=build(nums,s,mid);
root->right=build(nums,mid+1,e);
root->sum=root->left->sum+root->right->sum;
}
return root;
}
void update(segmentTreeNode* root,int i,int val)
{
if(root->start==root->end) root->sum=val;
else
{
int mid=root->start+(root->end-root->start)/2;
if(i<=mid)
update(root->left,i,val);
else update(root->right,i,val);
root->sum=root->left->sum+root->right->sum;
}
}
int sumRange(segmentTreeNode*root,int s,int e)
{
if(root->start==s&&root->end==e)
return root->sum;
int mid=root->start+(root->end-root->start)/2;
if(e<=mid) return sumRange(root->left,s,e);
else if(mid<s) return sumRange(root->right,s,e);
else return sumRange(root->left,s,mid)+sumRange(root->right,mid+1,e);
}
NumArray(vector<int> nums) {
root=build(nums,0,nums.size()-1);
}
void update(int i, int val) {
update(root,i,val);
}
int sumRange(int i, int j) {
int a= sumRange(root,i,j);
cout<<a<<endl;
return a;
}
private:
segmentTreeNode* root;
};