// Original CPU teaching model; not a device simulator or benchmark.
#include <iostream>
#include <vector>
#include <stdexcept>

void require(bool ok) { if (!ok) throw std::runtime_error("model check failed"); }

struct Node { char op; int value; int left; int right; };
int eval(const std::vector<Node>& nodes,int id) {
 const auto& n=nodes.at(static_cast<std::size_t>(id));
 if(n.op=='c') return n.value;
 const int a=eval(nodes,n.left),b=eval(nodes,n.right);
 if(n.op=='+') return a+b;
 require(n.op=='*');return a*b;
}
int main() {
 const std::vector<Node> tree{{'c',2,-1,-1},{'c',3,-1,-1},{'+',0,0,1},{'c',4,-1,-1},{'*',0,2,3}};
 const int result=eval(tree,4);require(result==20);std::cout<<"value="<<result<<'\n';
}

