#include <iostream>
#include <vector>
#include <stack>
using namespace std;
class node{
public:
int data;
vector<node*> children;
node(int val){
data = val; // this->data = data
}
~node(){
for(int i = 0 ;i<children.size();i++){
if(!children[i])
delete children[i];
}
}
};
class GenericTree{
public:
node* root; // line 3
int size;
GenericTree(vector<int> nums){
stack<node*> st;
size = 0;
for(int i = 0;i<nums.size();i++){
node *n = new node(nums[i]);
if(i == 0){
root = n;
st.push(n);
++size;
}else{
if(n->data == -1){
st.pop();
}else{
// cout << "In me" << endl;
st.top()->children.push_back(n);
st.push(n);
++size;
}
}
}
}
// tells us the number of nodes
int getSize(){
return size;
}
};
//------------------------vvvvv--------->const added here
int getSizeRecursive(node*const &root){ // line 1
if(root->children.size()==0)
return 1;
int size = 0;
//-----------vvvvv-------------------------->const added here
for(node*const &child : root->children) // line 2
size += getSizeRecursive(child);
return size+1;
}
int main(){
#ifndef ONLINE_JUDGE
freopen("input.txt","r",stdin);
freopen("output.txt","w",stdout);
freopen("error.txt","w",stderr);
#endif
vector<int> v{10,20,-1,30,50,-1,60,-1,-1,40,-1,-1};
GenericTree t(v); // node that tree has been created
cout << t.size << endl;
cout << getSizeRecursive(t.root) << endl;
return 0;
}