leetcode


class NumArray { class TreeNode{ int sum; int start,end; TreeNode left,right; public TreeNode(int s,int e){ left = null; right = null; start = s; end = e; } } TreeNode root = null; private TreeNode buildTree(int[] nums,int start,int end){ if(start > end){ return null; } TreeNode res = new TreeNode(start,end); if(start == end){ res.sum = nums[start]; }else{ int mid = start + (end - start)/2; res.left = buildTree(nums,start,mid); res.right = buildTree(nums,mid+1,end); res.sum = res.left.sum + res.right.sum; } return res; } public NumArray(int[] nums) { root = buildTree(nums,0,nums.length - 1); } private void update(TreeNode 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; } } public void update(int index, int val) { update(root,index,val); } private int query(TreeNode root,int i,int j){ if(root.start == i&&root.end == j){ return root.sum; }else{ int mid = root.start + (root.end - root.start)/2; if(j<=mid){ return query(root.left,i,j); }else if(i>=mid+1){ return query(root.right,i,j); }else{ return query(root.left,i,mid) + query(root.right,mid+1,j); } } } public int sumRange(int left, int right) { return query(root,left,right); }}/** * Your NumArray object will be instantiated and called as such: * NumArray obj = new NumArray(nums); * obj.update(index,val); * int param_2 = obj.sumRange(left,right); */