All challenges
Medium 0 solved 0% acceptance

Composite Folder Sizes

Compute the total size of every folder in a tree where folders contain files and other folders.

What you'll learn

  • Treat single items and groups the same way
  • Add child totals into their parent
  • Walk a tree from the leaves up

Problem

The composite pattern treats single objects and groups of objects the same way. A folder's size is its own files plus the sizes of everything inside it, however deep.

There are n items numbered 0 to n − 1 forming a tree. parents[i] is the folder that contains item i, or -1 for the root (exactly one item). sizes[i] is the size of item i's own content.

Implement composite_folder_sizes(parents, sizes).

Input

parents: The parent of each item.

sizes: The own size of each item.

Output

Return, for every item, its total size: its own size plus the totals of all its children.

Constraints

1 ≤ n ≤ 100,000

0 ≤ sizes[i] ≤ 10^9; parents describe a single tree

Examples

Example 1
Input:
sizes = [1, 2, 3, 4]
parents = [-1, 0, 0, 1]

Expected output:
expected = [10, 6, 3, 4]
Input:
std::vector<long long> sizes = {1, 2, 3, 4};
std::vector<long long> parents = {-1, 0, 0, 1};

Expected output:
std::vector<long long> expected = {10, 6, 3, 4};
Input:
long[] sizes = new long[] {1, 2, 3, 4};
long[] parents = new long[] {-1, 0, 0, 1};

Expected output:
long[] expected = new long[] {10, 6, 3, 4};

Explanation

Item 3 (size 4) is inside item 1, so item 1 totals 2 + 4 = 6. The root holds items 1 and 2: 1 + 6 + 3 = 10. Result: [10, 6, 3, 4].

Example 2
Input:
sizes = [5, 0, 7]
parents = [1, -1, 1]

Expected output:
expected = [5, 12, 7]
Input:
std::vector<long long> sizes = {5, 0, 7};
std::vector<long long> parents = {1, -1, 1};

Expected output:
std::vector<long long> expected = {5, 12, 7};
Input:
long[] sizes = new long[] {5, 0, 7};
long[] parents = new long[] {1, -1, 1};

Expected output:
long[] expected = new long[] {5, 12, 7};

Explanation

The root is item 1 with no content of its own; it contains items 0 and 2: 0 + 5 + 7 = 12.

How to approach it

Try on your own first, then open one hint at a time.

Hint 1

A folder's total is its own size plus its children's totals.

Hint 2

Process children before parents, for example in reverse depth order.

Hint 3

Avoid deep recursion on long chains; an explicit stack or ordering is safer.

Expected complexity

O(n) time, O(n) extra space

References

This challenge is adapted for CodeUtility. Follow the statement and constraints above.

Learn from others

Community solutions

No published solutions yet. Solve this challenge to share the first one.