# your code goes here
class Node:

    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right


def calculate_subtree_sums_binary_tree(root):
    subtree_sum = {}

    def dfs(node):
        if not node:
            return 0

        left_sum = dfs(node.left)
        right_sum = dfs(node.right)

        total_sum = node.val + left_sum + right_sum
        subtree_sum[node] = total_sum

        return total_sum

    dfs(root)
    return subtree_sum


if __name__ == "__main__":
    root = Node(10)
    root.left = Node(5)
    root.right = Node(-3)
    root.left.left = Node(3)
    root.left.right = Node(2)
    root.right.right = Node(11)

    sums = calculate_subtree_sums_binary_tree(root)

    for node, total in sums.items():
        print(f"Node(val={node.val}) -> Subtree Sum: {total}")