I'm going to use a smaller range for simplicity. So the tree looks like this:
[1,8]
[1,4] [5,8]
[1,2] [3,4] [5,6] [7,8]
[1,1] [2,2] [3,3] [4,4] [5,5] [6,6] [7,7] [8,8]
Each of those nodes stores the information that you're trying to find for that range. If you want to query the range [1,8], you only need to inspect the root node. If you want to query the range [3,5], when at the root you need to split it in to two queries, based on the left and right children of the node. [3,4] and [5,5].
When it comes to updating, you can use the same fashion as above and a term called "lazy propagation". If you were to update range [1,8] you would effectively have to update every node in the tree. Lazy propagation means that you would only update node [1,8] and leave a flag that says that it's children need to be updated. Then when you have to query deeper than [1,8] you push the update down to the children, along with the flag. This way you only update when needed.