#include <assert.h>
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
int ack_recursive(int m, int n) {
if (m == 0) {
return n + 1;
}
if (n == 0) {
return ack_recursive(m - 1, 1);
}
return ack_recursive(m - 1, ack_recursive(m, n - 1));
}
int ack_nonrecursive(int m, int n, int *status) {
int value[n];
size_t size = 0;
for (;;) {
if (m == 0) {
n++;
if (size-- == 0) {
*status = EXIT_SUCCESS;
break;
}
assert(size
< sizeof value
/ sizeof *value
); m = value[size];
continue;
}
if (n == 0) {
m--;
n = 1;
continue;
}
size_t index = size++;
assert(index
< sizeof value
/ sizeof *value
); value[index] = m - 1;
n--;
}
return n;
}
int main(void) {
for (int m = 0; m < 2; m++) {
for (int n = 0; n < 2; n++) {
int status;
assert(ack_recursive
(m
, n
) == ack_nonrecursive
(m
, n
, &status
) && status
== EXIT_SUCCESS
); }
}
}
I2luY2x1ZGUgPGFzc2VydC5oPgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0ZGludC5oPgojaW5jbHVkZSA8c3RkbGliLmg+CgppbnQgYWNrX3JlY3Vyc2l2ZShpbnQgbSwgaW50IG4pIHsKICAgIGlmIChtID09IDApIHsKICAgICAgICByZXR1cm4gbiArIDE7CiAgICB9CgogICAgaWYgKG4gPT0gMCkgewogICAgICAgIHJldHVybiBhY2tfcmVjdXJzaXZlKG0gLSAxLCAxKTsKICAgIH0KCiAgICByZXR1cm4gYWNrX3JlY3Vyc2l2ZShtIC0gMSwgYWNrX3JlY3Vyc2l2ZShtLCBuIC0gMSkpOwp9CgppbnQgYWNrX25vbnJlY3Vyc2l2ZShpbnQgbSwgaW50IG4sIGludCAqc3RhdHVzKSB7CiAgICBpbnQgdmFsdWVbbl07CiAgICBzaXplX3Qgc2l6ZSA9IDA7CgogICAgZm9yICg7OykgewogICAgICAgIGlmIChtID09IDApIHsKICAgICAgICAgICAgbisrOwogICAgICAgICAgICBpZiAoc2l6ZS0tID09IDApIHsKICAgICAgICAgICAgICAgICpzdGF0dXMgPSBFWElUX1NVQ0NFU1M7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBhc3NlcnQoc2l6ZSA8IHNpemVvZiB2YWx1ZSAvIHNpemVvZiAqdmFsdWUpOwogICAgICAgICAgICBtID0gdmFsdWVbc2l6ZV07CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KCiAgICAgICAgaWYgKG4gPT0gMCkgewogICAgICAgICAgICBtLS07CiAgICAgICAgICAgIG4gPSAxOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CgogICAgICAgIHNpemVfdCBpbmRleCA9IHNpemUrKzsKICAgICAgICBhc3NlcnQoaW5kZXggPCBzaXplb2YgdmFsdWUgLyBzaXplb2YgKnZhbHVlKTsKICAgICAgICB2YWx1ZVtpbmRleF0gPSBtIC0gMTsKICAgICAgICBuLS07CiAgICB9CgogICAgcmV0dXJuIG47Cn0KCmludCBtYWluKHZvaWQpIHsKICAgIGZvciAoaW50IG0gPSAwOyBtIDwgMjsgbSsrKSB7CiAgICAgICAgZm9yIChpbnQgbiA9IDA7IG4gPCAyOyBuKyspIHsKICAgICAgICAgICAgaW50IHN0YXR1czsKICAgICAgICAgICAgYXNzZXJ0KGFja19yZWN1cnNpdmUobSwgbikgPT0gYWNrX25vbnJlY3Vyc2l2ZShtLCBuLCAmc3RhdHVzKSAmJiBzdGF0dXMgPT0gRVhJVF9TVUNDRVNTKTsKICAgICAgICB9CiAgICB9Cn0=