public int sum(int l, int r) { // Do lazy updates to children propagate(); // Node's range fits inside query range if (l <= minPos && maxPos <= r) return sum; // Ranges do not overlap else if (r <= minPos || l >= maxPos) return 0; // Ranges partially overlap else return (left == null ? 0 : left.sum(l, r)) + (right == null ? 0 : right.sum(l, r)); }