#include <assert.h>
#include <ctype.h>
#include <stdio.h>
#include <string.h>
void print (int len, const int buf[]) {
int i = 0;
while (i < len && buf[i] == 0)
++i;
if (i == len) {
putchar('0');
} else {
do {
putchar(buf[i++] + '0');
} while (i < len);
}
putchar('\n');
}
int max_used_from (int from, const int used[]) {
int i;
for (i = from; i >= 0; --i)
if (used[i])
return i;
return -1;
}
int max_used (const int used[]) {
int i;
for (i = 9; i >= 0; --i)
if (used[i])
return i;
assert (!"empty used bitmap");
}
int min_used_from (int from, const int used[]) {
int i;
for (i = from; i <= 9; ++i)
if (used[i])
return i;
return -1;
}
int min_used (const int used[]) {
int i;
for (i = 0; i <= 9; ++i)
if (used[i])
return i;
assert (!"empty used bitmap");
}
void subtract(int len, const int over[], const int under[], int diff[]) {
int carry = 0;
for (int i = len - 1; i >= 0; --i) {
int d = over[i] - carry - under[i];
if (d >= 0) {
diff[i] = d;
carry = 0;
} else {
diff[i] = d + 10;
carry = 1;
}
}
}
void update_output (int len, const int buf[], const int buf_diff[],
int *out_len, int output[], int output_diff[]) {
// Test if buf_diff < output_diff
int i;
for (i = 0; i < len; ++i)
if (buf_diff[i] != output_diff[i])
break;
if (i < len && buf_diff[i] < output_diff[i]) {
*out_len = len;
memmove(output, buf, len * sizeof(int));
memmove(output_diff, buf_diff, len * sizeof(int));
}
}
void update_output_under (int len, const int goal[], const int buf[],
int *out_len, int output[], int output_diff[]) {
int buf_diff[len];
subtract(len, goal, buf, buf_diff);
update_output(len, buf, buf_diff, out_len, output, output_diff);
}
void update_output_over (int len, const int goal[], const int buf[],
int *out_len, int output[], int output_diff[]) {
int buf_diff[len];
subtract(len, buf, goal, buf_diff);
update_output(len, buf, buf_diff, out_len, output, output_diff);
}
/* Finds the number with at most [num] different digits such that the
* difference between [goal] and [output] is the minimum.
*
* num: number of different digits in output, 0 < num <= 10
* len: length of the goal number
* goal: array of size len, forall 0 <= i < len, 0 <= goal[i] < 10, and goal[0] > 0
* out_len: number of digits in the output
* output: array of size at least [len + 1]
*/
void NearestDigits (int num, int len, const int goal[],
int *out_len, int output[]) {
assert(0 < num && num <= 10);
assert(0 < len);
{
int used[10] = {0};
for (int i = 0; i < len; ++i)
used[goal[i]] = 1;
int n = 0;
for (int i = 0; i < 10; ++i)
n += used[i];
if (n <= num) {
*out_len = len;
memmove(output, goal, len * sizeof(int));
return;
}
}
int buf[len];
int output_diff[len];
if (goal[0] == 1 && num == 1) {
// Special case 1: 99999 may be the closest to goal 1xxxxx
*out_len = len /*- 1*/;
output[0] = 0;
for (int i = 1 /* - 1*/; i < len /*- 1*/; ++i)
output[i] = 9;
subtract(len, goal, output, output_diff);
} else if (goal[0] == 9) {
// Special case 2: 100000 or 111111 may be the closest to goal 9xxxxx
*out_len = len + 1;
if (num == 1) {
// Special case 2a: only one digit available: 111111
for (int i = 0; i <= len; ++i)
output[i] = 1;
int i, left = 1;
for (i = len - 1; i >= 0; --i) {
if (left >= goal[i]) {
output_diff[i] = left - goal[i];
left = 1;
} else {
output_diff[i] = 10 + left - goal[i];
left = 0;
}
}
} else { // num > 1
// Special case 2a: can use both 0 and 1: 100000
output[0] = 1;
for (int i = 1; i <= len; ++i)
output[i] = 0;
int i;
for (i = 0; i < len; ++i)
output_diff[i] = 9 - goal[i];
for (i = len - 1; i >= 0 && output_diff[i] == 9; --i)
output_diff[i] = 0;
++output_diff[i];
}
} else {
// Generic initialization
*out_len = 0;
for (int i = 0; i < len; ++i)
output_diff[i] = 9;
}
int used[10] = {0};
int i, n;
for (i = 0, n = num; i < len; ++i) {
buf[i] = goal[i];
// Two most common cases can be done greedily
if (used[goal[i]])
continue;
if (n > 2) {
used[goal[i]] = 1;
--n;
continue;
}
if (n == 2) {
if (goal[i] > 0 && !used[9]) {
// Possibility 1: pick one under and a nine
buf[i] = goal[i] - 1;
for (int j = i + 1; j < len; ++j)
buf[j] = 9;
update_output_under(len, goal, buf, out_len, output, output_diff);
}
if (goal[i] < 9 && !used[0]) {
// Possibility 2: pick one over and a zero
buf[i] = goal[i] + 1;
for (int j = i + 1; j < len; ++j)
buf[j] = 0;
update_output_over(len, goal, buf, out_len, output, output_diff);
}
// Possibility 3-5: match goal[i], go to n == 1
buf[i] = goal[i];
used[goal[i]] = 1;
--n;
continue;
} else { // n == 1
{
// Possibility 3: match goal[i]
used[goal[i]] = 1;
// Find out how much longer we can get freely
int j;
for (j = i + 1; j < len && used[goal[j]]; ++j)
buf[j] = goal[j];
if (j == len)
// should not happen: num == number_of_different_digits(goal)
return;
// Possibility 3a: maximal number that's smaller than goal.
int k = max_used_from(goal[j], used);
if (k >= 0) {
buf[j] = k;
int m = max_used(used);
for (k = j + 1; k < len; ++k)
buf[k] = m;
update_output_under(len, goal, buf, out_len, output, output_diff);
}
// Possibility 3b: minimal number that's larger than goal.
k = min_used_from (goal[j], used);
if (k >= 0) {
buf[j] = k;
int m = min_used(used);
for (k = j + 1; k < len; ++k)
buf[k] = m;
update_output_over(len, goal, buf, out_len, output, output_diff);
}
used[goal[i]] = 0;
} // End of possibility 3
if (goal[i] > 0) {
// Possibility 4: take 1 lower here, find maximal
buf[i] = goal[i] - 1;
if (used[goal[i] - 1]) {
// Possibility 4a: number already covered, can use 9
for (int j = i + 1; j < len; ++j)
buf[j] = 9;
update_output_under(len, goal, buf, out_len, output, output_diff);
} else {
// Possibility 4b: new number, choose filler from used
used[goal[i] - 1] = 1;
int k = max_used(used);
for (int j = i + 1; j < len; ++j)
buf[j] = k;
update_output_under(len, goal, buf, out_len, output, output_diff);
used[goal[i] - 1] = 0;
}
} // End of possibility 4
if (goal[i] < 9) {
// Possibility 5: take 1 over here, find minimal
buf[i] = goal[i] + 1;
if (used[goal[i] + 1]) {
// Possibility 5a: number already covered, can use 0
for (int j = i + 1; j < len; ++j)
buf[j] = 0;
update_output_over(len, goal, buf, out_len, output, output_diff);
} else {
// Possibility 5b: new number, choose filler from used
used[goal[i] + 1] = 1;
int k = min_used(used);
for (int j = i + 1; j < len; ++j)
buf[j] = k;
update_output_over(len, goal, buf, out_len, output, output_diff);
used[goal[i] + 1] = 0;
}
} // End of possibility 5
return;
} // n == 1
} // for i = 0 to len - 1
} // void NearestDigits
int goal[1024];
int output[1024];
int main () {
int num;
while (scanf(" %d ", &num) == 1) {
int len = 0, c;
while (isdigit(c = getchar())) {
if (len < 1023)
goal[len++] = c - '0';
}
int out_len;
NearestDigits (num, len, goal, &out_len, output);
print(out_len, output);
}
return 0;
}
I2luY2x1ZGUgPGFzc2VydC5oPgojaW5jbHVkZSA8Y3R5cGUuaD4KI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KCnZvaWQgcHJpbnQgKGludCBsZW4sIGNvbnN0IGludCBidWZbXSkgewogICAgaW50IGkgPSAwOwogICAgd2hpbGUgKGkgPCBsZW4gJiYgYnVmW2ldID09IDApCiAgICAgICAgKytpOwogICAgaWYgKGkgPT0gbGVuKSB7CiAgICAgICAgcHV0Y2hhcignMCcpOwogICAgfSBlbHNlIHsKICAgICAgICBkbyB7CiAgICAgICAgICAgIHB1dGNoYXIoYnVmW2krK10gKyAnMCcpOwogICAgICAgIH0gd2hpbGUgKGkgPCBsZW4pOwogICAgfQogICAgcHV0Y2hhcignXG4nKTsKfQoKaW50IG1heF91c2VkX2Zyb20gKGludCBmcm9tLCBjb25zdCBpbnQgdXNlZFtdKSB7CiAgICBpbnQgaTsKICAgIGZvciAoaSA9IGZyb207IGkgPj0gMDsgLS1pKQogICAgICAgIGlmICh1c2VkW2ldKQogICAgICAgICAgICByZXR1cm4gaTsKICAgIHJldHVybiAtMTsKfQoKaW50IG1heF91c2VkIChjb25zdCBpbnQgdXNlZFtdKSB7CiAgICBpbnQgaTsKICAgIGZvciAoaSA9IDk7IGkgPj0gMDsgLS1pKQogICAgICAgIGlmICh1c2VkW2ldKQogICAgICAgICAgICByZXR1cm4gaTsKICAgIGFzc2VydCAoISJlbXB0eSB1c2VkIGJpdG1hcCIpOwp9CgppbnQgbWluX3VzZWRfZnJvbSAoaW50IGZyb20sIGNvbnN0IGludCB1c2VkW10pIHsKICAgIGludCBpOwogICAgZm9yIChpID0gZnJvbTsgaSA8PSA5OyArK2kpCiAgICAgICAgaWYgKHVzZWRbaV0pCiAgICAgICAgICAgIHJldHVybiBpOwogICAgcmV0dXJuIC0xOwp9CgppbnQgbWluX3VzZWQgKGNvbnN0IGludCB1c2VkW10pIHsKICAgIGludCBpOwogICAgZm9yIChpID0gMDsgaSA8PSA5OyArK2kpCiAgICAgICAgaWYgKHVzZWRbaV0pCiAgICAgICAgICAgIHJldHVybiBpOwogICAgYXNzZXJ0ICghImVtcHR5IHVzZWQgYml0bWFwIik7Cn0KCnZvaWQgc3VidHJhY3QoaW50IGxlbiwgY29uc3QgaW50IG92ZXJbXSwgY29uc3QgaW50IHVuZGVyW10sIGludCBkaWZmW10pIHsKICAgIGludCBjYXJyeSA9IDA7CiAgICBmb3IgKGludCBpID0gbGVuIC0gMTsgaSA+PSAwOyAtLWkpIHsKICAgICAgICBpbnQgZCA9IG92ZXJbaV0gLSBjYXJyeSAtIHVuZGVyW2ldOwogICAgICAgIGlmIChkID49IDApIHsKICAgICAgICAgICAgZGlmZltpXSA9IGQ7CiAgICAgICAgICAgIGNhcnJ5ID0gMDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBkaWZmW2ldID0gZCArIDEwOwogICAgICAgICAgICBjYXJyeSA9IDE7CiAgICAgICAgfQogICAgfQp9Cgp2b2lkIHVwZGF0ZV9vdXRwdXQgKGludCBsZW4sIGNvbnN0IGludCBidWZbXSwgY29uc3QgaW50IGJ1Zl9kaWZmW10sCiAgICAgICAgICAgICAgICAgICAgaW50ICpvdXRfbGVuLCBpbnQgb3V0cHV0W10sIGludCBvdXRwdXRfZGlmZltdKSB7CiAgICAvLyBUZXN0IGlmIGJ1Zl9kaWZmIDwgb3V0cHV0X2RpZmYKICAgIGludCBpOwogICAgZm9yIChpID0gMDsgaSA8IGxlbjsgKytpKQogICAgICAgIGlmIChidWZfZGlmZltpXSAhPSBvdXRwdXRfZGlmZltpXSkKICAgICAgICAgICAgYnJlYWs7CgogICAgaWYgKGkgPCBsZW4gJiYgYnVmX2RpZmZbaV0gPCBvdXRwdXRfZGlmZltpXSkgewogICAgICAgICpvdXRfbGVuID0gbGVuOwogICAgICAgIG1lbW1vdmUob3V0cHV0LCBidWYsIGxlbiAqIHNpemVvZihpbnQpKTsKICAgICAgICBtZW1tb3ZlKG91dHB1dF9kaWZmLCBidWZfZGlmZiwgbGVuICogc2l6ZW9mKGludCkpOwogICAgfQp9Cgp2b2lkIHVwZGF0ZV9vdXRwdXRfdW5kZXIgKGludCBsZW4sIGNvbnN0IGludCBnb2FsW10sIGNvbnN0IGludCBidWZbXSwKICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKm91dF9sZW4sIGludCBvdXRwdXRbXSwgaW50IG91dHB1dF9kaWZmW10pIHsKICAgIGludCBidWZfZGlmZltsZW5dOwogICAgc3VidHJhY3QobGVuLCBnb2FsLCBidWYsIGJ1Zl9kaWZmKTsKICAgIHVwZGF0ZV9vdXRwdXQobGVuLCBidWYsIGJ1Zl9kaWZmLCBvdXRfbGVuLCBvdXRwdXQsIG91dHB1dF9kaWZmKTsKfQoKdm9pZCB1cGRhdGVfb3V0cHV0X292ZXIgKGludCBsZW4sIGNvbnN0IGludCBnb2FsW10sIGNvbnN0IGludCBidWZbXSwKICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqb3V0X2xlbiwgaW50IG91dHB1dFtdLCBpbnQgb3V0cHV0X2RpZmZbXSkgewogICAgaW50IGJ1Zl9kaWZmW2xlbl07CiAgICBzdWJ0cmFjdChsZW4sIGJ1ZiwgZ29hbCwgYnVmX2RpZmYpOwogICAgdXBkYXRlX291dHB1dChsZW4sIGJ1ZiwgYnVmX2RpZmYsIG91dF9sZW4sIG91dHB1dCwgb3V0cHV0X2RpZmYpOwp9CgovKiBGaW5kcyB0aGUgbnVtYmVyIHdpdGggYXQgbW9zdCBbbnVtXSBkaWZmZXJlbnQgZGlnaXRzIHN1Y2ggdGhhdCB0aGUKICogZGlmZmVyZW5jZSBiZXR3ZWVuIFtnb2FsXSBhbmQgW291dHB1dF0gaXMgdGhlIG1pbmltdW0uCiAqCiAqIG51bTogbnVtYmVyIG9mIGRpZmZlcmVudCBkaWdpdHMgaW4gb3V0cHV0LCAwIDwgbnVtIDw9IDEwCiAqIGxlbjogbGVuZ3RoIG9mIHRoZSBnb2FsIG51bWJlcgogKiBnb2FsOiBhcnJheSBvZiBzaXplIGxlbiwgZm9yYWxsIDAgPD0gaSA8IGxlbiwgMCA8PSBnb2FsW2ldIDwgMTAsIGFuZCBnb2FsWzBdID4gMAogKiBvdXRfbGVuOiBudW1iZXIgb2YgZGlnaXRzIGluIHRoZSBvdXRwdXQKICogb3V0cHV0OiBhcnJheSBvZiBzaXplIGF0IGxlYXN0IFtsZW4gKyAxXQogKi8Kdm9pZCBOZWFyZXN0RGlnaXRzIChpbnQgbnVtLCBpbnQgbGVuLCBjb25zdCBpbnQgZ29hbFtdLAogICAgICAgICAgICAgICAgICAgIGludCAqb3V0X2xlbiwgaW50IG91dHB1dFtdKSB7CiAgICBhc3NlcnQoMCA8IG51bSAmJiBudW0gPD0gMTApOwogICAgYXNzZXJ0KDAgPCBsZW4pOwoKICAgIHsKICAgICAgICBpbnQgdXNlZFsxMF0gPSB7MH07CiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47ICsraSkKICAgICAgICAgICAgdXNlZFtnb2FsW2ldXSA9IDE7CiAgICAgICAgaW50IG4gPSAwOwogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTA7ICsraSkKICAgICAgICAgICAgbiArPSB1c2VkW2ldOwogICAgICAgIGlmIChuIDw9IG51bSkgewogICAgICAgICAgICAqb3V0X2xlbiA9IGxlbjsKICAgICAgICAgICAgbWVtbW92ZShvdXRwdXQsIGdvYWwsIGxlbiAqIHNpemVvZihpbnQpKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBpbnQgYnVmW2xlbl07CiAgICBpbnQgb3V0cHV0X2RpZmZbbGVuXTsKCiAgICBpZiAoZ29hbFswXSA9PSAxICYmIG51bSA9PSAxKSB7CiAgICAgICAgLy8gU3BlY2lhbCBjYXNlIDE6IDk5OTk5IG1heSBiZSB0aGUgY2xvc2VzdCB0byBnb2FsIDF4eHh4eAogICAgICAgICpvdXRfbGVuID0gbGVuIC8qLSAxKi87CiAgICAgICAgb3V0cHV0WzBdID0gMDsKICAgICAgICBmb3IgKGludCBpID0gMSAvKiAtIDEqLzsgaSA8IGxlbiAvKi0gMSovOyArK2kpCiAgICAgICAgICAgIG91dHB1dFtpXSA9IDk7CiAgICAgICAgc3VidHJhY3QobGVuLCBnb2FsLCBvdXRwdXQsIG91dHB1dF9kaWZmKTsKICAgIH0gZWxzZSBpZiAoZ29hbFswXSA9PSA5KSB7CiAgICAgICAgLy8gU3BlY2lhbCBjYXNlIDI6IDEwMDAwMCBvciAxMTExMTEgbWF5IGJlIHRoZSBjbG9zZXN0IHRvIGdvYWwgOXh4eHh4CiAgICAgICAgKm91dF9sZW4gPSBsZW4gKyAxOwogICAgICAgIGlmIChudW0gPT0gMSkgewogICAgICAgICAgICAvLyBTcGVjaWFsIGNhc2UgMmE6IG9ubHkgb25lIGRpZ2l0IGF2YWlsYWJsZTogMTExMTExCiAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDw9IGxlbjsgKytpKQogICAgICAgICAgICAgICAgb3V0cHV0W2ldID0gMTsKCiAgICAgICAgICAgIGludCBpLCBsZWZ0ID0gMTsKICAgICAgICAgICAgZm9yIChpID0gbGVuIC0gMTsgaSA+PSAwOyAtLWkpIHsKICAgICAgICAgICAgICAgIGlmIChsZWZ0ID49IGdvYWxbaV0pIHsKICAgICAgICAgICAgICAgICAgICBvdXRwdXRfZGlmZltpXSA9IGxlZnQgLSBnb2FsW2ldOwogICAgICAgICAgICAgICAgICAgIGxlZnQgPSAxOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBvdXRwdXRfZGlmZltpXSA9IDEwICsgbGVmdCAtIGdvYWxbaV07CiAgICAgICAgICAgICAgICAgICAgbGVmdCA9IDA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgeyAgLy8gbnVtID4gMQogICAgICAgICAgICAvLyBTcGVjaWFsIGNhc2UgMmE6IGNhbiB1c2UgYm90aCAwIGFuZCAxOiAxMDAwMDAKICAgICAgICAgICAgb3V0cHV0WzBdID0gMTsKICAgICAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gbGVuOyArK2kpCiAgICAgICAgICAgICAgICBvdXRwdXRbaV0gPSAwOwoKICAgICAgICAgICAgaW50IGk7CiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47ICsraSkKICAgICAgICAgICAgICAgIG91dHB1dF9kaWZmW2ldID0gOSAtIGdvYWxbaV07CiAgICAgICAgICAgIGZvciAoaSA9IGxlbiAtIDE7IGkgPj0gMCAmJiBvdXRwdXRfZGlmZltpXSA9PSA5OyAtLWkpCiAgICAgICAgICAgICAgICBvdXRwdXRfZGlmZltpXSA9IDA7CiAgICAgICAgICAgICsrb3V0cHV0X2RpZmZbaV07CiAgICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgICAvLyBHZW5lcmljIGluaXRpYWxpemF0aW9uCiAgICAgICAgKm91dF9sZW4gPSAwOwogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyArK2kpCiAgICAgICAgICAgIG91dHB1dF9kaWZmW2ldID0gOTsKICAgIH0KCiAgICBpbnQgdXNlZFsxMF0gPSB7MH07CiAgICBpbnQgaSwgbjsKICAgIGZvciAoaSA9IDAsIG4gPSBudW07IGkgPCBsZW47ICsraSkgewogICAgICAgIGJ1ZltpXSA9IGdvYWxbaV07CgogICAgICAgIC8vIFR3byBtb3N0IGNvbW1vbiBjYXNlcyBjYW4gYmUgZG9uZSBncmVlZGlseQogICAgICAgIGlmICh1c2VkW2dvYWxbaV1dKQogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICBpZiAobiA+IDIpIHsKICAgICAgICAgICAgdXNlZFtnb2FsW2ldXSA9IDE7CiAgICAgICAgICAgIC0tbjsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgfQoKICAgICAgICBpZiAobiA9PSAyKSB7CiAgICAgICAgICAgIGlmIChnb2FsW2ldID4gMCAmJiAhdXNlZFs5XSkgewogICAgICAgICAgICAgICAgLy8gUG9zc2liaWxpdHkgMTogcGljayBvbmUgdW5kZXIgYW5kIGEgbmluZQogICAgICAgICAgICAgICAgYnVmW2ldID0gZ29hbFtpXSAtIDE7CiAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gaSArIDE7IGogPCBsZW47ICsraikKICAgICAgICAgICAgICAgICAgICBidWZbal0gPSA5OwogICAgICAgICAgICAgICAgdXBkYXRlX291dHB1dF91bmRlcihsZW4sIGdvYWwsIGJ1Ziwgb3V0X2xlbiwgb3V0cHV0LCBvdXRwdXRfZGlmZik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChnb2FsW2ldIDwgOSAmJiAhdXNlZFswXSkgewogICAgICAgICAgICAgICAgLy8gUG9zc2liaWxpdHkgMjogcGljayBvbmUgb3ZlciBhbmQgYSB6ZXJvCiAgICAgICAgICAgICAgICBidWZbaV0gPSBnb2FsW2ldICsgMTsKICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSBpICsgMTsgaiA8IGxlbjsgKytqKQogICAgICAgICAgICAgICAgICAgIGJ1ZltqXSA9IDA7CiAgICAgICAgICAgICAgICB1cGRhdGVfb3V0cHV0X292ZXIobGVuLCBnb2FsLCBidWYsIG91dF9sZW4sIG91dHB1dCwgb3V0cHV0X2RpZmYpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBQb3NzaWJpbGl0eSAzLTU6IG1hdGNoIGdvYWxbaV0sIGdvIHRvIG4gPT0gMQogICAgICAgICAgICBidWZbaV0gPSBnb2FsW2ldOwogICAgICAgICAgICB1c2VkW2dvYWxbaV1dID0gMTsKICAgICAgICAgICAgLS1uOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9IGVsc2UgeyAgLy8gbiA9PSAxCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIFBvc3NpYmlsaXR5IDM6IG1hdGNoIGdvYWxbaV0KICAgICAgICAgICAgICAgIHVzZWRbZ29hbFtpXV0gPSAxOwoKICAgICAgICAgICAgICAgIC8vIEZpbmQgb3V0IGhvdyBtdWNoIGxvbmdlciB3ZSBjYW4gZ2V0IGZyZWVseQogICAgICAgICAgICAgICAgaW50IGo7CiAgICAgICAgICAgICAgICBmb3IgKGogPSBpICsgMTsgaiA8IGxlbiAmJiB1c2VkW2dvYWxbal1dOyArK2opCiAgICAgICAgICAgICAgICAgICAgYnVmW2pdID0gZ29hbFtqXTsKCiAgICAgICAgICAgICAgICBpZiAoaiA9PSBsZW4pCiAgICAgICAgICAgICAgICAgICAgLy8gc2hvdWxkIG5vdCBoYXBwZW46IG51bSA9PSBudW1iZXJfb2ZfZGlmZmVyZW50X2RpZ2l0cyhnb2FsKQogICAgICAgICAgICAgICAgICAgIHJldHVybjsKCiAgICAgICAgICAgICAgICAvLyBQb3NzaWJpbGl0eSAzYTogbWF4aW1hbCBudW1iZXIgdGhhdCdzIHNtYWxsZXIgdGhhbiBnb2FsLgogICAgICAgICAgICAgICAgaW50IGsgPSBtYXhfdXNlZF9mcm9tKGdvYWxbal0sIHVzZWQpOwogICAgICAgICAgICAgICAgaWYgKGsgPj0gMCkgewogICAgICAgICAgICAgICAgICAgIGJ1ZltqXSA9IGs7CgogICAgICAgICAgICAgICAgICAgIGludCBtID0gbWF4X3VzZWQodXNlZCk7CiAgICAgICAgICAgICAgICAgICAgZm9yIChrID0gaiArIDE7IGsgPCBsZW47ICsraykKICAgICAgICAgICAgICAgICAgICAgICAgYnVmW2tdID0gbTsKICAgICAgICAgICAgICAgICAgICB1cGRhdGVfb3V0cHV0X3VuZGVyKGxlbiwgZ29hbCwgYnVmLCBvdXRfbGVuLCBvdXRwdXQsIG91dHB1dF9kaWZmKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBQb3NzaWJpbGl0eSAzYjogbWluaW1hbCBudW1iZXIgdGhhdCdzIGxhcmdlciB0aGFuIGdvYWwuCiAgICAgICAgICAgICAgICBrID0gbWluX3VzZWRfZnJvbSAoZ29hbFtqXSwgdXNlZCk7CiAgICAgICAgICAgICAgICBpZiAoayA+PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgYnVmW2pdID0gazsKCiAgICAgICAgICAgICAgICAgICAgaW50IG0gPSBtaW5fdXNlZCh1c2VkKTsKICAgICAgICAgICAgICAgICAgICBmb3IgKGsgPSBqICsgMTsgayA8IGxlbjsgKytrKQogICAgICAgICAgICAgICAgICAgICAgICBidWZba10gPSBtOwogICAgICAgICAgICAgICAgICAgIHVwZGF0ZV9vdXRwdXRfb3ZlcihsZW4sIGdvYWwsIGJ1Ziwgb3V0X2xlbiwgb3V0cHV0LCBvdXRwdXRfZGlmZik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB1c2VkW2dvYWxbaV1dID0gMDsKICAgICAgICAgICAgfSAgLy8gRW5kIG9mIHBvc3NpYmlsaXR5IDMKCiAgICAgICAgICAgIGlmIChnb2FsW2ldID4gMCkgewogICAgICAgICAgICAgICAgLy8gUG9zc2liaWxpdHkgNDogdGFrZSAxIGxvd2VyIGhlcmUsIGZpbmQgbWF4aW1hbAogICAgICAgICAgICAgICAgYnVmW2ldID0gZ29hbFtpXSAtIDE7CiAgICAgICAgICAgICAgICBpZiAodXNlZFtnb2FsW2ldIC0gMV0pIHsKICAgICAgICAgICAgICAgICAgICAvLyBQb3NzaWJpbGl0eSA0YTogbnVtYmVyIGFscmVhZHkgY292ZXJlZCwgY2FuIHVzZSA5CiAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IGkgKyAxOyBqIDwgbGVuOyArK2opCiAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZltqXSA9IDk7CiAgICAgICAgICAgICAgICAgICAgdXBkYXRlX291dHB1dF91bmRlcihsZW4sIGdvYWwsIGJ1Ziwgb3V0X2xlbiwgb3V0cHV0LCBvdXRwdXRfZGlmZik7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIC8vIFBvc3NpYmlsaXR5IDRiOiBuZXcgbnVtYmVyLCBjaG9vc2UgZmlsbGVyIGZyb20gdXNlZAogICAgICAgICAgICAgICAgICAgIHVzZWRbZ29hbFtpXSAtIDFdID0gMTsKICAgICAgICAgICAgICAgICAgICBpbnQgayA9IG1heF91c2VkKHVzZWQpOwogICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSBpICsgMTsgaiA8IGxlbjsgKytqKQogICAgICAgICAgICAgICAgICAgICAgICBidWZbal0gPSBrOwogICAgICAgICAgICAgICAgICAgIHVwZGF0ZV9vdXRwdXRfdW5kZXIobGVuLCBnb2FsLCBidWYsIG91dF9sZW4sIG91dHB1dCwgb3V0cHV0X2RpZmYpOwogICAgICAgICAgICAgICAgICAgIHVzZWRbZ29hbFtpXSAtIDFdID0gMDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSAgLy8gRW5kIG9mIHBvc3NpYmlsaXR5IDQKCiAgICAgICAgICAgIGlmIChnb2FsW2ldIDwgOSkgewogICAgICAgICAgICAgICAgLy8gUG9zc2liaWxpdHkgNTogdGFrZSAxIG92ZXIgaGVyZSwgZmluZCBtaW5pbWFsCiAgICAgICAgICAgICAgICBidWZbaV0gPSBnb2FsW2ldICsgMTsKICAgICAgICAgICAgICAgIGlmICh1c2VkW2dvYWxbaV0gKyAxXSkgewogICAgICAgICAgICAgICAgICAgIC8vIFBvc3NpYmlsaXR5IDVhOiBudW1iZXIgYWxyZWFkeSBjb3ZlcmVkLCBjYW4gdXNlIDAKICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gaSArIDE7IGogPCBsZW47ICsraikKICAgICAgICAgICAgICAgICAgICAgICAgYnVmW2pdID0gMDsKICAgICAgICAgICAgICAgICAgICB1cGRhdGVfb3V0cHV0X292ZXIobGVuLCBnb2FsLCBidWYsIG91dF9sZW4sIG91dHB1dCwgb3V0cHV0X2RpZmYpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAvLyBQb3NzaWJpbGl0eSA1YjogbmV3IG51bWJlciwgY2hvb3NlIGZpbGxlciBmcm9tIHVzZWQKICAgICAgICAgICAgICAgICAgICB1c2VkW2dvYWxbaV0gKyAxXSA9IDE7CiAgICAgICAgICAgICAgICAgICAgaW50IGsgPSBtaW5fdXNlZCh1c2VkKTsKICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gaSArIDE7IGogPCBsZW47ICsraikKICAgICAgICAgICAgICAgICAgICAgICAgYnVmW2pdID0gazsKICAgICAgICAgICAgICAgICAgICB1cGRhdGVfb3V0cHV0X292ZXIobGVuLCBnb2FsLCBidWYsIG91dF9sZW4sIG91dHB1dCwgb3V0cHV0X2RpZmYpOwogICAgICAgICAgICAgICAgICAgIHVzZWRbZ29hbFtpXSArIDFdID0gMDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSAgLy8gRW5kIG9mIHBvc3NpYmlsaXR5IDUKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0gIC8vIG4gPT0gMQogICAgfSAgLy8gZm9yIGkgPSAwIHRvIGxlbiAtIDEKfSAgLy8gdm9pZCBOZWFyZXN0RGlnaXRzCgppbnQgZ29hbFsxMDI0XTsKaW50IG91dHB1dFsxMDI0XTsKCmludCBtYWluICgpIHsKICAgIGludCBudW07CiAgICB3aGlsZSAoc2NhbmYoIiAlZCAiLCAmbnVtKSA9PSAxKSB7CiAgICAgICAgaW50IGxlbiA9IDAsIGM7CiAgICAgICAgd2hpbGUgKGlzZGlnaXQoYyA9IGdldGNoYXIoKSkpIHsKICAgICAgICAgICAgaWYgKGxlbiA8IDEwMjMpCiAgICAgICAgICAgICAgICBnb2FsW2xlbisrXSA9IGMgLSAnMCc7CiAgICAgICAgfQogICAgICAgIGludCBvdXRfbGVuOwogICAgICAgIE5lYXJlc3REaWdpdHMgKG51bSwgbGVuLCBnb2FsLCAmb3V0X2xlbiwgb3V0cHV0KTsKICAgICAgICBwcmludChvdXRfbGVuLCBvdXRwdXQpOwogICAgfQogICAgcmV0dXJuIDA7Cn0K