#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 = NULL;
size_t size = 0;
while (size >= 0) {
if (m == 0) {
n++;
if (size-- == 0) {
*status = EXIT_SUCCESS;
break;
}
m = value[size];
continue;
}
if (n == 0) {
m--;
n = 1;
continue;
}
size_t index = size++;
if ((size & index) == 0) {
if (size >= SIZE_MAX / sizeof *value) {
*status = EXIT_FAILURE;
break;
}
void *temp
= realloc(value
, (2 * size
+ 1) * sizeof *value
); if (temp == NULL) {
*status = EXIT_FAILURE;
break;
}
value = temp;
}
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+CgppbnQgYWNrX3JlY3Vyc2l2ZShpbnQgbSwgaW50IG4pIHsKICAgIGlmIChtID09IDApIHsKICAgICAgICByZXR1cm4gbiArIDE7CiAgICB9CgogICAgaWYgKG4gPT0gMCkgewogICAgICAgIHJldHVybiBhY2tfcmVjdXJzaXZlKG0gLSAxLCAxKTsKICAgIH0KCiAgICByZXR1cm4gYWNrX3JlY3Vyc2l2ZShtIC0gMSwgYWNrX3JlY3Vyc2l2ZShtLCBuIC0gMSkpOwp9CgppbnQgYWNrX25vbnJlY3Vyc2l2ZShpbnQgbSwgaW50IG4sIGludCAqc3RhdHVzKSB7CiAgICBpbnQgKnZhbHVlID0gTlVMTDsKICAgIHNpemVfdCBzaXplID0gMDsKCiAgICB3aGlsZSAoc2l6ZSA+PSAwKSB7CiAgICAgICAgaWYgKG0gPT0gMCkgewogICAgICAgICAgICBuKys7CiAgICAgICAgICAgIGlmIChzaXplLS0gPT0gMCkgewogICAgICAgICAgICAgICAgKnN0YXR1cyA9IEVYSVRfU1VDQ0VTUzsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG0gPSB2YWx1ZVtzaXplXTsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgfQoKICAgICAgICBpZiAobiA9PSAwKSB7CiAgICAgICAgICAgIG0tLTsKICAgICAgICAgICAgbiA9IDE7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KCiAgICAgICAgc2l6ZV90IGluZGV4ID0gc2l6ZSsrOwogICAgICAgIGlmICgoc2l6ZSAmIGluZGV4KSA9PSAwKSB7CiAgICAgICAgICAgIGlmIChzaXplID49IFNJWkVfTUFYIC8gc2l6ZW9mICp2YWx1ZSkgewogICAgICAgICAgICAJKnN0YXR1cyA9IEVYSVRfRkFJTFVSRTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2b2lkICp0ZW1wID0gcmVhbGxvYyh2YWx1ZSwgKDIgKiBzaXplICsgMSkgKiBzaXplb2YgKnZhbHVlKTsKICAgICAgICAgICAgaWYgKHRlbXAgPT0gTlVMTCkgewogICAgICAgICAgICAJKnN0YXR1cyA9IEVYSVRfRkFJTFVSRTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YWx1ZSA9IHRlbXA7CiAgICAgICAgfQoKICAgICAgICB2YWx1ZVtpbmRleF0gPSBtIC0gMTsKICAgICAgICBuLS07CiAgICB9CgogICAgZnJlZSh2YWx1ZSk7CiAgICByZXR1cm4gbjsKfQoKaW50IG1haW4odm9pZCkgewogICAgZm9yIChpbnQgbSA9IDA7IG0gPCAyOyBtKyspIHsKICAgICAgICBmb3IgKGludCBuID0gMDsgbiA8IDI7IG4rKykgewogICAgICAgICAgICBpbnQgc3RhdHVzOwogICAgICAgICAgICBhc3NlcnQoYWNrX3JlY3Vyc2l2ZShtLCBuKSA9PSBhY2tfbm9ucmVjdXJzaXZlKG0sIG4sICZzdGF0dXMpICYmIHN0YXR1cyA9PSBFWElUX1NVQ0NFU1MpOwogICAgICAgIH0KICAgIH0KfQ==