#include <stdio.h>
#include <vector>
int fib1(int n) {
if (n < 2) {
return n;
} else {
return fib1(n - 1) + fib1(n - 2);
}
}
int fib2(int n) {
std::vector<int> data_stack;
std::vector<int> call_stack = {0, n};
int x, t;
L3:
if (call_stack.back() < 2) {
data_stack.push_back(call_stack.back());
call_stack.pop_back();
switch (call_stack.back()) {
case 0: goto L0;
case 1: goto L1;
case 2: goto L2;
}
} else {
x = call_stack.back();
call_stack.push_back(1);
call_stack.push_back(x - 1);
goto L3;
L1: call_stack.pop_back();
x = call_stack.back();
call_stack.push_back(2);
call_stack.push_back(x - 2);
goto L3;
L2: call_stack.pop_back();
int left = data_stack.back();
data_stack.pop_back();
int right = data_stack.back();
data_stack.pop_back();
data_stack.push_back(left + right);
call_stack.pop_back();
switch (call_stack.back()) {
case 0: goto L0;
case 1: goto L1;
case 2: goto L2;
}
}
L0:
return data_stack.back();
}
int main() {
printf("%d %d\n", fib1(10), fib2(10));
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CgojaW5jbHVkZSA8dmVjdG9yPgoKaW50IGZpYjEoaW50IG4pIHsKICBpZiAobiA8IDIpIHsKICAgIHJldHVybiBuOwogIH0gZWxzZSB7CiAgICByZXR1cm4gZmliMShuIC0gMSkgKyBmaWIxKG4gLSAyKTsKICB9Cn0KCmludCBmaWIyKGludCBuKSB7CiAgc3RkOjp2ZWN0b3I8aW50PiBkYXRhX3N0YWNrOwogIHN0ZDo6dmVjdG9yPGludD4gY2FsbF9zdGFjayA9IHswLCBufTsKICBpbnQgeCwgdDsKTDM6CiAgaWYgKGNhbGxfc3RhY2suYmFjaygpIDwgMikgewogICAgZGF0YV9zdGFjay5wdXNoX2JhY2soY2FsbF9zdGFjay5iYWNrKCkpOwogICAgY2FsbF9zdGFjay5wb3BfYmFjaygpOwogICAgc3dpdGNoIChjYWxsX3N0YWNrLmJhY2soKSkgewogICAgICBjYXNlIDA6IGdvdG8gTDA7CiAgICAgIGNhc2UgMTogZ290byBMMTsKICAgICAgY2FzZSAyOiBnb3RvIEwyOwogICAgfQogIH0gZWxzZSB7CiAgICB4ID0gY2FsbF9zdGFjay5iYWNrKCk7CiAgICBjYWxsX3N0YWNrLnB1c2hfYmFjaygxKTsKICAgIGNhbGxfc3RhY2sucHVzaF9iYWNrKHggLSAxKTsKICAgIGdvdG8gTDM7CkwxOiBjYWxsX3N0YWNrLnBvcF9iYWNrKCk7CiAgICB4ID0gY2FsbF9zdGFjay5iYWNrKCk7CiAgICBjYWxsX3N0YWNrLnB1c2hfYmFjaygyKTsKICAgIGNhbGxfc3RhY2sucHVzaF9iYWNrKHggLSAyKTsKICAgIGdvdG8gTDM7CkwyOiBjYWxsX3N0YWNrLnBvcF9iYWNrKCk7CiAgICBpbnQgbGVmdCA9IGRhdGFfc3RhY2suYmFjaygpOwogICAgZGF0YV9zdGFjay5wb3BfYmFjaygpOwogICAgaW50IHJpZ2h0ID0gZGF0YV9zdGFjay5iYWNrKCk7CiAgICBkYXRhX3N0YWNrLnBvcF9iYWNrKCk7CiAgICBkYXRhX3N0YWNrLnB1c2hfYmFjayhsZWZ0ICsgcmlnaHQpOwogICAgY2FsbF9zdGFjay5wb3BfYmFjaygpOwogICAgc3dpdGNoIChjYWxsX3N0YWNrLmJhY2soKSkgewogICAgICBjYXNlIDA6IGdvdG8gTDA7CiAgICAgIGNhc2UgMTogZ290byBMMTsKICAgICAgY2FzZSAyOiBnb3RvIEwyOwogICAgfQogIH0KTDA6CiAgcmV0dXJuIGRhdGFfc3RhY2suYmFjaygpOwp9CgppbnQgbWFpbigpIHsKICBwcmludGYoIiVkICVkXG4iLCBmaWIxKDEwKSwgZmliMigxMCkpOwogIHJldHVybiAwOwp9