#include <iostream>
#include <stack>
using namespace std;
struct Call {
int b; // Current exponent
int cur_res; // Current accumulated result
int cur_loc; // Current location in the "function"
};
int G(int n, int b) {
stack<Call> st;
st.push({ b, 1, 0 }); // Initial call: exponent = b, cur_res = 1, cur_loc = 0
int last_ret_val = 1;
while (!st.empty()) {
Call& call = st.top();
if (call.cur_loc == 0) {
if (call.b == 0) {
// Base case: return cur_res (which is the final result)
last_ret_val = call.cur_res;
st.pop();
}
else {
// Schedule next call: multiply by n and decrement exponent
call.cur_loc = 1;
st.push({ call.b - 1, call.cur_res * n, 0 });
}
}
else if (call.cur_loc == 1) {
// The recursive call has completed, and last_ret_val holds the result
// No further action needed; just pop the call
st.pop();
}
}
return last_ret_val;
}
int main() {
cout << G(2, 3) << endl; // Output: 8 (2^3 = 8)
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RhY2s+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgpzdHJ1Y3QgQ2FsbCB7CiAgICBpbnQgYjsgICAgICAgICAgLy8gQ3VycmVudCBleHBvbmVudAogICAgaW50IGN1cl9yZXM7ICAgIC8vIEN1cnJlbnQgYWNjdW11bGF0ZWQgcmVzdWx0CiAgICBpbnQgY3VyX2xvYzsgICAgLy8gQ3VycmVudCBsb2NhdGlvbiBpbiB0aGUgImZ1bmN0aW9uIgp9OwoKaW50IEcoaW50IG4sIGludCBiKSB7CiAgICBzdGFjazxDYWxsPiBzdDsKICAgIHN0LnB1c2goeyBiLCAxLCAwIH0pOyAgLy8gSW5pdGlhbCBjYWxsOiBleHBvbmVudCA9IGIsIGN1cl9yZXMgPSAxLCBjdXJfbG9jID0gMAoKICAgIGludCBsYXN0X3JldF92YWwgPSAxOwoKICAgIHdoaWxlICghc3QuZW1wdHkoKSkgewogICAgICAgIENhbGwmIGNhbGwgPSBzdC50b3AoKTsKCiAgICAgICAgaWYgKGNhbGwuY3VyX2xvYyA9PSAwKSB7CiAgICAgICAgICAgIGlmIChjYWxsLmIgPT0gMCkgewogICAgICAgICAgICAgICAgLy8gQmFzZSBjYXNlOiByZXR1cm4gY3VyX3JlcyAod2hpY2ggaXMgdGhlIGZpbmFsIHJlc3VsdCkKICAgICAgICAgICAgICAgIGxhc3RfcmV0X3ZhbCA9IGNhbGwuY3VyX3JlczsKICAgICAgICAgICAgICAgIHN0LnBvcCgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgLy8gU2NoZWR1bGUgbmV4dCBjYWxsOiBtdWx0aXBseSBieSBuIGFuZCBkZWNyZW1lbnQgZXhwb25lbnQKICAgICAgICAgICAgICAgIGNhbGwuY3VyX2xvYyA9IDE7CiAgICAgICAgICAgICAgICBzdC5wdXNoKHsgY2FsbC5iIC0gMSwgY2FsbC5jdXJfcmVzICogbiwgMCB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChjYWxsLmN1cl9sb2MgPT0gMSkgewogICAgICAgICAgICAvLyBUaGUgcmVjdXJzaXZlIGNhbGwgaGFzIGNvbXBsZXRlZCwgYW5kIGxhc3RfcmV0X3ZhbCBob2xkcyB0aGUgcmVzdWx0CiAgICAgICAgICAgIC8vIE5vIGZ1cnRoZXIgYWN0aW9uIG5lZWRlZDsganVzdCBwb3AgdGhlIGNhbGwKICAgICAgICAgICAgc3QucG9wKCk7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiBsYXN0X3JldF92YWw7Cn0KCmludCBtYWluKCkgewogICAgY291dCA8PCBHKDIsIDMpIDw8IGVuZGw7ICAvLyBPdXRwdXQ6IDggKDJeMyA9IDgpCiAgICByZXR1cm4gMDsKfQ==