#include using namespace std; struct NodeState { int index; int length; int signal; }; int cs(int type, int signal) { if (type == 0) return 0; if (type == 2) return 15; if (type == 3) return signal - 1; if (type >= 4 && type <= 7) { int boost = 0; if (type == 4) boost = 0; else if (type == 5) boost = 1; else if (type == 6) boost = 2; else if (type == 7) boost = 4; return (signal + boost) - 1; } return signal; } int dfs(const vector& tree) { if (tree.empty() || tree[0] != 1) { return 0; } int max_l = 0; stack stk; stk.push({0, 0, 15}); while (!stk.empty()) { NodeState c = stk.top(); stk.pop(); if (c.index >= tree.size() || c.signal <= 0 || tree[c.index] == 0) { continue; } int new_s = cs(tree[c.index], c.signal); int new_l = c.length + 1; if (new_l > max_l) { max_l = new_l; } if (new_s > 0) { stk.push({2 * c.index + 2, new_l, new_s}); stk.push({2 * c.index + 1, new_l, new_s}); } } return max_l; } int main() { freopen ("redstone.in","r",stdin); freopen ("redstone.out","w",stdout); int n; cin >> n; vector tree(n); for (int i = 0; i < n; i++) { cin >> tree[i]; } int result = dfs(tree); cout << result << endl; fclose (stdin); fclose (stdout); return 0; }