#include <iostream>
#include <vector>
using namespace std;
enum class type {
vector_type,
integer_type
};
// Object can either be an Integer or Vector<Object>
class Object {
public:
type type_;
vector<Object> vec_;
int num_;
Object(): type_(type::integer_type)
{
}
Object(const Object& other): type_(other.type_)
{
if(other.type_ == type::vector_type)
vec_ = other.vec_;
else
num_ = other.num_;
}
//Object(const vector<int> &vec): type_(type::vector_type) {
// for (int i = 0; i < vec.size(); i++) {
// vec_.push_back(Object(vec[i]));
// }
//}
Object(const vector<int> &vec): type_(type::vector_type),
vec_(vec.begin(), vec.end()) {
}
Object& operator=(const Object &other) {
type_ = other.type_;
if(other.type_ == type::vector_type)
vec_ = other.vec_;
else
num_ = other.num_;
return *this;
}
Object(const vector<Object> &vec) {
type_ = type::vector_type;
vec_ = vec;
}
Object(int num): type_(type::integer_type),
num_(num)
{
}
};
int getSum_internal(Object &o, int &sum) {
for (int i = 0; i < o.vec_.size(); i++) {
if (o.vec_[i].type_ == type::integer_type) {
sum += o.vec_[i].num_;
}
if (o.vec_[i].type_ == type::vector_type) {
getSum_internal(o.vec_[i], sum);
}
}
}
int getSum(Object &o) {
int sum = 0;
getSum_internal(o, sum);
return sum;
}
int main() {
// to construct somth like that: [1,2, [3, [4,5], 6], 7]
Object o1(vector<int>({1,2}));
Object o2(vector<int>({3}));
Object o3(vector<int>({4,5}));
Object o4(vector<int>({6}));
Object o5(vector<Object>({o2,o3,o4}));
Object o6(vector<int>({7}));
Object o(vector<Object>({o1,o5,o6}));
cout << getSum(o) << endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPiAKI2luY2x1ZGUgPHZlY3Rvcj4gCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgplbnVtIGNsYXNzIHR5cGUgewogIHZlY3Rvcl90eXBlLAogIGludGVnZXJfdHlwZQp9OwoKLy8gT2JqZWN0IGNhbiBlaXRoZXIgYmUgYW4gSW50ZWdlciBvciBWZWN0b3I8T2JqZWN0PiAKY2xhc3MgT2JqZWN0IHsKcHVibGljOgogIHR5cGUgdHlwZV87CiAgdmVjdG9yPE9iamVjdD4gdmVjXzsKICBpbnQgbnVtXzsKCiAgT2JqZWN0KCk6IHR5cGVfKHR5cGU6OmludGVnZXJfdHlwZSkKICB7CiAgfQoKICBPYmplY3QoY29uc3QgT2JqZWN0JiBvdGhlcik6IHR5cGVfKG90aGVyLnR5cGVfKQogIHsKICAgIGlmKG90aGVyLnR5cGVfID09IHR5cGU6OnZlY3Rvcl90eXBlKQogICAgICB2ZWNfID0gb3RoZXIudmVjXzsKICAgIGVsc2UKICAgICAgbnVtXyA9IG90aGVyLm51bV87CiAgfQoKICAvL09iamVjdChjb25zdCB2ZWN0b3I8aW50PiAmdmVjKTogdHlwZV8odHlwZTo6dmVjdG9yX3R5cGUpIHsKICAvLyAgICBmb3IgKGludCBpID0gMDsgaSA8IHZlYy5zaXplKCk7IGkrKykgewogIC8vICAgIAl2ZWNfLnB1c2hfYmFjayhPYmplY3QodmVjW2ldKSk7CiAgLy8gICAgfQogIC8vfQoKICBPYmplY3QoY29uc3QgdmVjdG9yPGludD4gJnZlYyk6IHR5cGVfKHR5cGU6OnZlY3Rvcl90eXBlKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWNfKHZlYy5iZWdpbigpLCB2ZWMuZW5kKCkpIHsKICB9CiAgCiAgT2JqZWN0JiBvcGVyYXRvcj0oY29uc3QgT2JqZWN0ICZvdGhlcikgewogICAgdHlwZV8gPSBvdGhlci50eXBlXzsKICAgIGlmKG90aGVyLnR5cGVfID09IHR5cGU6OnZlY3Rvcl90eXBlKQogICAgICB2ZWNfID0gb3RoZXIudmVjXzsKICAgIGVsc2UKICAgICAgbnVtXyA9IG90aGVyLm51bV87CiAgICByZXR1cm4gKnRoaXM7CiAgfQogIAogIE9iamVjdChjb25zdCB2ZWN0b3I8T2JqZWN0PiAmdmVjKSB7CiAgCXR5cGVfID0gdHlwZTo6dmVjdG9yX3R5cGU7CiAgCXZlY18gPSB2ZWM7CiAgfQogIAogIE9iamVjdChpbnQgbnVtKTogdHlwZV8odHlwZTo6aW50ZWdlcl90eXBlKSwKICAgICAgbnVtXyhudW0pCiAgewogIH0KfTsKCmludCBnZXRTdW1faW50ZXJuYWwoT2JqZWN0ICZvLCBpbnQgJnN1bSkgewoJZm9yIChpbnQgaSA9IDA7IGkgPCBvLnZlY18uc2l6ZSgpOyBpKyspIHsKCQlpZiAoby52ZWNfW2ldLnR5cGVfID09IHR5cGU6OmludGVnZXJfdHlwZSkgewoJCQlzdW0gKz0gby52ZWNfW2ldLm51bV87CgkJfQoJCQoJCWlmIChvLnZlY19baV0udHlwZV8gPT0gdHlwZTo6dmVjdG9yX3R5cGUpIHsKCQkJZ2V0U3VtX2ludGVybmFsKG8udmVjX1tpXSwgc3VtKTsKCQl9Cgl9Cn0KCmludCBnZXRTdW0oT2JqZWN0ICZvKSB7CglpbnQgc3VtID0gMDsKCWdldFN1bV9pbnRlcm5hbChvLCBzdW0pOwoJcmV0dXJuIHN1bTsKfQoKaW50IG1haW4oKSB7CiAgLy8gdG8gY29uc3RydWN0IHNvbXRoIGxpa2UgdGhhdDogWzEsMiwgWzMsIFs0LDVdLCA2XSwgN10gCiAgT2JqZWN0IG8xKHZlY3RvcjxpbnQ+KHsxLDJ9KSk7CiAgT2JqZWN0IG8yKHZlY3RvcjxpbnQ+KHszfSkpOwogIE9iamVjdCBvMyh2ZWN0b3I8aW50Pih7NCw1fSkpOwogIE9iamVjdCBvNCh2ZWN0b3I8aW50Pih7Nn0pKTsKICBPYmplY3QgbzUodmVjdG9yPE9iamVjdD4oe28yLG8zLG80fSkpOwogIE9iamVjdCBvNih2ZWN0b3I8aW50Pih7N30pKTsKICBPYmplY3Qgbyh2ZWN0b3I8T2JqZWN0Pih7bzEsbzUsbzZ9KSk7CgogIGNvdXQgPDwgZ2V0U3VtKG8pIDw8IGVuZGw7CiAgCiAgcmV0dXJuIDA7Cn0=