#include <iostream>
#include <vector>
#include <string>
#include <sstream>
using namespace std;
enum class ElemType
{
VAL,
DOWN,
UP,
NONE
};
class Elem
{
public:
Elem(): t(ElemType::VAL), val(0) {}
Elem(const ElemType _t, const int _val): t(_t), val(_val) {}
Elem(const ElemType _t) : Elem(_t, 0) {}
ElemType t;
int val;
};
class MyDS
{
public:
// Initialization Example: [[1,2],3,[4,5],[], [6]]
MyDS(): v({{ElemType::DOWN}, {ElemType::VAL,1}, {ElemType::VAL,2}, {ElemType::UP}, {ElemType::VAL,3}, {ElemType::DOWN}, {ElemType::VAL,4}, {ElemType::VAL,5}, {ElemType::UP}, {ElemType::DOWN}, {ElemType::NONE}, {ElemType::UP}, {ElemType::DOWN}, {ElemType::VAL,6}, {ElemType::UP}}) {}
vector<Elem> v;
string toStr() const
{
stringstream res;
unsigned int curr_depth=0;
bool isComma=false;
for(const auto& e : v)
{
if(e.t == ElemType::DOWN) {res << (isComma?",":"") << "["; isComma=false;}
else if(e.t == ElemType::UP) {res << "]"; isComma=true; }
else if(e.t == ElemType::VAL) {res << ( (isComma)?",":"" ) << e.val; isComma=true;}
else if(e.t == ElemType::NONE) {res << ""; isComma=true;}
}
return res.str();
}
};
template <typename T>
class MaybeMonad
{
public:
MaybeMonad(const T& _data): isValid(true), data(_data) {}
MaybeMonad() : isValid(false), data(0) {}
bool isValid;
T data;
string toStr() const
{
if(isValid) return to_string(data);
return "";
}
};
class Iterator
{
public:
Iterator(const MyDS& _d) : is_index_valid(false), index(0), d(_d), n_vals(0), tot_n_vals(count()) {}
bool hasNext() const
{
return n_vals<tot_n_vals;
}
MaybeMonad<int> get()
{
//MaybeMonad<int> res;
if(!is_index_valid) {is_index_valid=true; index=0;}
else index++;
if(index == d.v.size()) {throw runtime_error("No more elements"); }
while( (d.v[index].t != ElemType::VAL) && (d.v[index].t != ElemType::NONE) )
{
index++;
if(index == d.v.size()) {throw runtime_error("No more elements");}
}
n_vals++;
if(d.v[index].t == ElemType::VAL) return MaybeMonad<int>(d.v[index].val);
index++;
return MaybeMonad<int>();
}
private:
// Just get the reference, do not copy it
const MyDS& d;
bool is_index_valid;
unsigned int index;
unsigned int n_vals;
unsigned int tot_n_vals;
// O(N) loop to count the actual elements
unsigned int count() const
{
unsigned int res=0;
for(const auto& e : d.v) res += ( (e.t == ElemType::VAL) || (e.t == ElemType::NONE) )?1:0;
return res;
}
};
int main() {
// your code goes here
MyDS d;
cout << d.toStr() << endl;
Iterator it(d);
while(it.hasNext()) cout << it.get().toStr() << ",";
cout << endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8c3N0cmVhbT4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmVudW0gY2xhc3MgRWxlbVR5cGUKewoJVkFMLCAKCURPV04sIAoJVVAsIAoJTk9ORQp9OyAKCmNsYXNzIEVsZW0KewoJcHVibGljOiAKCUVsZW0oKTogdChFbGVtVHlwZTo6VkFMKSwgdmFsKDApIHt9CglFbGVtKGNvbnN0IEVsZW1UeXBlIF90LCBjb25zdCBpbnQgX3ZhbCk6IHQoX3QpLCB2YWwoX3ZhbCkge30KCUVsZW0oY29uc3QgRWxlbVR5cGUgX3QpIDogRWxlbShfdCwgMCkge30KCQoJRWxlbVR5cGUgdDsgCglpbnQgdmFsOyAKfTsgCgoKY2xhc3MgTXlEUwp7CglwdWJsaWM6IAoJLy8gSW5pdGlhbGl6YXRpb24gRXhhbXBsZTogW1sxLDJdLDMsWzQsNV0sW10sIFs2XV0KCU15RFMoKTogdih7e0VsZW1UeXBlOjpET1dOfSwge0VsZW1UeXBlOjpWQUwsMX0sIHtFbGVtVHlwZTo6VkFMLDJ9LCB7RWxlbVR5cGU6OlVQfSwge0VsZW1UeXBlOjpWQUwsM30sIHtFbGVtVHlwZTo6RE9XTn0sIHtFbGVtVHlwZTo6VkFMLDR9LCB7RWxlbVR5cGU6OlZBTCw1fSwge0VsZW1UeXBlOjpVUH0sIHtFbGVtVHlwZTo6RE9XTn0sIHtFbGVtVHlwZTo6Tk9ORX0sIHtFbGVtVHlwZTo6VVB9LCB7RWxlbVR5cGU6OkRPV059LCB7RWxlbVR5cGU6OlZBTCw2fSwge0VsZW1UeXBlOjpVUH19KSB7fQoJCgl2ZWN0b3I8RWxlbT4gdjsKCQoJc3RyaW5nIHRvU3RyKCkgY29uc3QgCgl7CgkJc3RyaW5nc3RyZWFtIHJlczsgCgkJdW5zaWduZWQgaW50IGN1cnJfZGVwdGg9MDsgCgkJCgkJYm9vbCBpc0NvbW1hPWZhbHNlOyAKCQlmb3IoY29uc3QgYXV0byYgZSA6IHYpCgkJewoJCQlpZihlLnQgPT0gRWxlbVR5cGU6OkRPV04pIHtyZXMgPDwgKGlzQ29tbWE/IiwiOiIiKSA8PCAiWyI7IGlzQ29tbWE9ZmFsc2U7fSAKCQkJZWxzZSBpZihlLnQgPT0gRWxlbVR5cGU6OlVQKSB7cmVzIDw8ICJdIjsgaXNDb21tYT10cnVlOyB9CgkJCWVsc2UgaWYoZS50ID09IEVsZW1UeXBlOjpWQUwpIHtyZXMgPDwgKCAoaXNDb21tYSk/IiwiOiIiICkgPDwgZS52YWw7IGlzQ29tbWE9dHJ1ZTt9IAoJCQllbHNlIGlmKGUudCA9PSBFbGVtVHlwZTo6Tk9ORSkge3JlcyA8PCAiIjsgaXNDb21tYT10cnVlO30gCgkJfQoJCQoJCXJldHVybiByZXMuc3RyKCk7IAoJfQp9OyAKCnRlbXBsYXRlIDx0eXBlbmFtZSBUPgpjbGFzcyBNYXliZU1vbmFkCnsKCXB1YmxpYzogCglNYXliZU1vbmFkKGNvbnN0IFQmIF9kYXRhKTogaXNWYWxpZCh0cnVlKSwgZGF0YShfZGF0YSkge30KCU1heWJlTW9uYWQoKSA6IGlzVmFsaWQoZmFsc2UpLCBkYXRhKDApIHt9CgkKCWJvb2wgaXNWYWxpZDsgCglUIGRhdGE7IAoJCglzdHJpbmcgdG9TdHIoKSBjb25zdCAKCXsKCQlpZihpc1ZhbGlkKSByZXR1cm4gdG9fc3RyaW5nKGRhdGEpOyAKCQlyZXR1cm4gIiI7IAoJfQp9OyAKCmNsYXNzIEl0ZXJhdG9yCnsKCXB1YmxpYzogCglJdGVyYXRvcihjb25zdCBNeURTJiBfZCkgOiBpc19pbmRleF92YWxpZChmYWxzZSksIGluZGV4KDApLCBkKF9kKSwgIG5fdmFscygwKSwgdG90X25fdmFscyhjb3VudCgpKSB7fQoJCgkKCWJvb2wgaGFzTmV4dCgpIGNvbnN0Cgl7CgkJcmV0dXJuIG5fdmFsczx0b3Rfbl92YWxzOyAKCX0KCQoJTWF5YmVNb25hZDxpbnQ+IGdldCgpIAoJewoJCS8vTWF5YmVNb25hZDxpbnQ+IHJlczsgCgkJaWYoIWlzX2luZGV4X3ZhbGlkKSB7aXNfaW5kZXhfdmFsaWQ9dHJ1ZTsgaW5kZXg9MDt9CgkJZWxzZSBpbmRleCsrOyAKCQlpZihpbmRleCA9PSBkLnYuc2l6ZSgpKSB7dGhyb3cgcnVudGltZV9lcnJvcigiTm8gbW9yZSBlbGVtZW50cyIpOyB9CgkJCgkJd2hpbGUoIChkLnZbaW5kZXhdLnQgIT0gRWxlbVR5cGU6OlZBTCkgJiYgKGQudltpbmRleF0udCAhPSBFbGVtVHlwZTo6Tk9ORSkgKQoJCXsKCQkJaW5kZXgrKzsgCgkJCWlmKGluZGV4ID09IGQudi5zaXplKCkpIHt0aHJvdyBydW50aW1lX2Vycm9yKCJObyBtb3JlIGVsZW1lbnRzIik7fSAgCgkJfQoKCQluX3ZhbHMrKzsgCQkKCQlpZihkLnZbaW5kZXhdLnQgPT0gRWxlbVR5cGU6OlZBTCkgcmV0dXJuIE1heWJlTW9uYWQ8aW50PihkLnZbaW5kZXhdLnZhbCk7IAoJCWluZGV4Kys7IAoJCXJldHVybiBNYXliZU1vbmFkPGludD4oKTsgCgl9CgkKCXByaXZhdGU6IAoJCgkvLyBKdXN0IGdldCB0aGUgcmVmZXJlbmNlLCBkbyBub3QgY29weSBpdCAKCWNvbnN0IE15RFMmIGQ7IAoJCglib29sIGlzX2luZGV4X3ZhbGlkOyAKCXVuc2lnbmVkIGludCBpbmRleDsgCgl1bnNpZ25lZCBpbnQgbl92YWxzOyAKCXVuc2lnbmVkIGludCB0b3Rfbl92YWxzOyAKCgkKCS8vIE8oTikgbG9vcCB0byBjb3VudCB0aGUgYWN0dWFsIGVsZW1lbnRzIAoJdW5zaWduZWQgaW50IGNvdW50KCkgY29uc3QgCgl7CgkJdW5zaWduZWQgaW50IHJlcz0wOyAKCQlmb3IoY29uc3QgYXV0byYgZSA6IGQudikgcmVzICs9ICggKGUudCA9PSBFbGVtVHlwZTo6VkFMKSB8fCAoZS50ID09IEVsZW1UeXBlOjpOT05FKSApPzE6MDsgCgkJcmV0dXJuIHJlczsgCgl9Cn07IAoKaW50IG1haW4oKSB7CgkvLyB5b3VyIGNvZGUgZ29lcyBoZXJlCglNeURTIGQ7IAoJY291dCA8PCBkLnRvU3RyKCkgPDwgZW5kbDsgCglJdGVyYXRvciBpdChkKTsgCgl3aGlsZShpdC5oYXNOZXh0KCkpIGNvdXQgPDwgaXQuZ2V0KCkudG9TdHIoKSA8PCAiLCI7IAoJY291dCA8PCBlbmRsOyAKCXJldHVybiAwOwp9CgoKCgo=