This is for [Project Euler question 18](https://projecteuler.net/problem=18) and I'm looking for feedback on whether my algorithm is incorrect or whether I've just implemented it wrong (which I don't think is the case after some testing).

The question is to traverse the maximum path in a triangle.

>     75
>     95 64
>     17 47 82
>     18 35 87 10
>     20 04 82 47 65
>     19 01 23 75 03 34
>     88 02 77 73 07 63 67
>     99 65 04 28 06 16 70 92
>     41 41 26 56 83 40 80 70 33
>     41 48 72 33 47 32 37 16 94 29
>     53 71 44 65 25 43 91 52 97 51 14
>     70 11 33 28 77 73 17 78 39 68 17 57
>     91 71 52 38 17 14 91 43 58 50 27 29 48
>     63 66 04 68 89 53 67 30 73 16 69 87 40 31
>     04 62 98 27 23 09 70 98 73 93 38 53 60 04 23

Starting from the second bottom row, each value is its current value + `max(left child, right child)`, which transforms each position in the tree to be its max path sum from that point.

    #include <iostream>
    #include <fstream>
    #include <iterator>
    #include <sstream>
    #include <vector>
    
    using namespace std;
    using Tree = vector<vector<int>>;
    
    constexpr bool LEFT {false};
    constexpr bool RIGHT {true};
    
    int pathsum(Tree& tree, size_t layer, size_t pos, bool right) {
    	int sum {};
    	++layer;	// next level
    	for (; layer < tree.size(); ++layer) 
    		if (right) sum += tree[layer][++pos];
    		else sum += tree[layer][pos];
    	return sum;
    }
    
    int max_pathsum(Tree& tree) {
    	// start from bottom up, each node's value is node.val + max(left child, right child)
    	for (int layer = tree.size() - 2; layer >= 0; --layer) {
    		for (size_t pos = 0; pos < tree[layer].size(); ++pos) {
    			tree[layer][pos] = tree[layer][pos] + max(tree[layer+1][pos], tree[layer+1][pos+1]);
    		}
    	}
    	return tree[0][0];
    }
    
    int main(int argc, char* argv[]) {
    	if (argc < 2) { cout << "Need to pass in file to read from\n"; return 1; }
    
    	ifstream f {argv[1]};
    	if (!f.is_open()) { cout << "Could not open file\n"; return 1; }
    
    	Tree tree;
    	string line;
    	while (getline(f, line)) {
    		istringstream is {line};
    		tree.push_back(vector<int>(istream_iterator<int>(is), istream_iterator<int>()));
    	}
    
    	int mps {max_pathsum(tree)};
    	cout << "Max path sum: " << mps << endl;
    }