#include <algorithm>
#include <iostream>
#include <cstring>
using namespace std;
const int LIM = 3030;
template<typename T> void maximize(T &res, const T &val) { if (res < val) res = val; }
template<typename T> void minimize(T &res, const T &val) { if (res > val) res = val; }
int r, c, h, w;
int a[LIM][LIM];
int subtask1()
{
return r * c;
}
int subtask2()
{
return (r * c + 1) / 2;
}
int value[LIM * LIM];
int subtask3()
{
int res = 0;
for (int lx = 1, rx = h; rx <= r; ++lx, ++rx)
{
for (int ly = 1, ry = w; ry <= c; ++ly, ++ry)
{
int p = 0;
for (int x = lx; x <= rx; ++x)
for (int y = ly; y <= ry; ++y)
value[++p] = a[x][y];
sort(value + 1, value + p + 1);
maximize(res, value[(p + 1) / 2]);
}
}
return res;
}
/// ====*====*====*====*====*====*====*====*====*====*====*====*====*====*====*====*====*====
int used[LIM * LIM];
int subtask4()
{
int timer = 0;
memset(used, 0, sizeof(used));
int res = 0;
for (int lx = 1, rx = h; rx <= r; ++lx, ++rx)
{
for (int ly = 1, ry = w; ry <= c; ++ly, ++ry)
{
int mn = r * c;
int mx = 1;
++timer;
for (int x = lx; x <= rx; ++x)
{
for (int y = ly; y <= ry; ++y)
{
minimize(mn, a[x][y]);
maximize(mx, a[x][y]);
used[a[x][y]] = timer;
}
}
int cnt = (h * w + 1) / 2;
for (int v = mn; v <= mx; ++v)
{
if (used[v] == timer)
{
if (--cnt == 0)
{
maximize(res, v);
break;
}
}
}
}
}
return res;
}
int bit[LIM * LIM];
void bit_construct()
{
memset(bit, 0, sizeof(bit[0]) * (r * c + 1));
}
void bit_update(int p, int v)
{
for (; p <= r * c; p += p & -p)
bit[p] += v;
}
int bit_query(int p)
{
int res = 0;
for (; p >= 1; p -= p & -p)
res += bit[p];
return res;
}
int bit_median()
{
int expected = (h * w + 1) / 2;
int upper = r * c - expected + 1;
int lower = expected;
int res = -1;
for (int l = lower, r = upper; l <= r; )
{
int m = (l + r) >> 1;
if (bit_query(m) >= expected)
{
res = m;
r = m - 1;
}
else
{
l = m + 1;
}
}
return res;
}
int subtask5()
{
int res = 0;
for (int lx = 1, rx = h; rx <= r; ++lx, ++rx)
{
bit_construct();
for (int x = lx; x <= rx; ++x)
for (int y = 1; y <= w; ++y)
bit_update(a[x][y], +1);
for (int ly = 1, ry = w; ry <= c; ++ly, ++ry)
{
maximize(res, bit_median());
if (ry == c) break;
for (int x = lx; x <= rx; ++x)
{
bit_update(a[x][ly + 0], -1);
bit_update(a[x][ry + 1], +1);
}
}
}
return res;
}
int bit2d[LIM][LIM];
void bit2d_construct()
{
for (int x = 1; x <= r; ++x)
memset(bit2d[x], 0, sizeof(bit2d[x][0]) * (c + 1));
}
void bit2d_update(int x, int y, int v)
{
for (int p = x; p <= r; p += p & -p)
for (int q = y; q <= c; q += q & -q)
bit2d[p][q] += v;
}
int bit2d_query(int x, int y)
{
int res = 0;
for (int p = x; p >= 1; p -= p & -p)
for (int q = y; q >= 1; q -= q & -q)
res += bit2d[p][q];
return res;
}
void bit2d_area_update(int x, int y, int u, int v, int k)
{
bit2d_update(u, v, +k);
bit2d_update(u, y - 1, -k);
bit2d_update(x - 1, v, -k);
bit2d_update(x - 1, y - 1, +k);
}
int bit2d_area_query(int x, int y, int u, int v)
{
int res = 0;
res += bit2d_query(u, v);
res -= bit2d_query(u, y - 1);
res -= bit2d_query(x - 1, v);
res += bit2d_query(x - 1, y - 1);
return res;
}
int testing(int value, int target)
{
bit2d_construct();
for (int i = 1; i <= r; ++i)
{
for (int j = 1; j <= c; ++j)
{
if (a[i][j] >= value)
bit2d_update(i, j, +1);
if (i >= h && j >= w)
{
int cnt = bit2d_area_query(i - h + 1, j - w + 1, i, j);
if (cnt >= target)
return true;
}
}
}
return false;
}
int subtask6()
{
int expected = (h * w + 1) / 2;
int upper = r * c - expected + 1;
int lower = expected;
int res = -1;
for (int l = lower, r = upper; l <= r; )
{
int m = (l + r) >> 1;
if (testing(m, expected))
{
maximize(res, m);
l = m + 1;
}
else
{
r = m - 1;
}
}
return res;
}
int b[LIM][LIM];
int check(int value, int target)
{
for (int i = 1; i <= r; ++i)
{
for (int j = 1; j <= c; ++j)
{
b[i][j] = b[i - 1][j] + b[i][j - 1] - b[i - 1][j - 1];
b[i][j] += (a[i][j] >= value);
}
}
for (int lx = 1, rx = h; rx <= r; ++lx, ++rx)
{
for (int ly = 1, ry = w; ry <= c; ++ly, ++ry)
{
int cnt = b[rx][ry] - b[lx - 1][ry] - b[rx][ly - 1] + b[lx - 1][ly - 1];
if (cnt >= target)
return true;
}
}
return false;
}
int subtask7()
{
int expected = (h * w + 1) / 2;
int upper = r * c - expected + 1;
int lower = expected;
int res = -1;
for (int l = lower, r = upper; l <= r; )
{
int m = (l + r) >> 1;
if (check(m, expected))
{
maximize(res, m);
l = m + 1;
}
else
{
r = m - 1;
}
}
return res;
}
int main()
{
ios::sync_with_stdio(NULL);
cin.tie(NULL);
cin >> r >> c >> h >> w;
if (h == 1 && w == 1) return cout << subtask1(), 0;
if (h == r && w == c) return cout << subtask2(), 0;
for (int i = 1; i <= r; ++i)
for (int j = 1; j <= c; ++j)
cin >> a[i][j];
if (r <= 30 && c <= 30) return cout << subtask3(), 0;
if (r <= 100 && c <= 100) return cout << subtask4(), 0;
if (r <= 300 && c <= 300) return cout << subtask5(), 0;
if (r <= 1000 && c <= 1000) return cout << subtask6(), 0;
if (r <= 3000 && c <= 3000) return cout << subtask7(), 0;
return 0;
}
I2luY2x1ZGUgPGFsZ29yaXRobT4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Y3N0cmluZz4KCnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgpjb25zdCBpbnQgTElNID0gMzAzMDsKCnRlbXBsYXRlPHR5cGVuYW1lIFQ+IHZvaWQgbWF4aW1pemUoVCAmcmVzLCBjb25zdCBUICZ2YWwpIHsgaWYgKHJlcyA8IHZhbCkgcmVzID0gdmFsOyB9CnRlbXBsYXRlPHR5cGVuYW1lIFQ+IHZvaWQgbWluaW1pemUoVCAmcmVzLCBjb25zdCBUICZ2YWwpIHsgaWYgKHJlcyA+IHZhbCkgcmVzID0gdmFsOyB9CgppbnQgciwgYywgaCwgdzsKaW50IGFbTElNXVtMSU1dOwoKCmludCBzdWJ0YXNrMSgpIAp7IAogICAgcmV0dXJuIHIgKiBjOyAKfQogICAgCgppbnQgc3VidGFzazIoKQp7IAogICAgcmV0dXJuIChyICogYyArIDEpIC8gMjsKfQoKCmludCB2YWx1ZVtMSU0gKiBMSU1dOwppbnQgc3VidGFzazMoKQp7CiAgICBpbnQgcmVzID0gMDsKICAgIGZvciAoaW50IGx4ID0gMSwgcnggPSBoOyByeCA8PSByOyArK2x4LCArK3J4KQogICAgewogICAgICAgIGZvciAoaW50IGx5ID0gMSwgcnkgPSB3OyByeSA8PSBjOyArK2x5LCArK3J5KQogICAgICAgIHsKICAgICAgICAgICAgaW50IHAgPSAwOwogICAgICAgICAgICBmb3IgKGludCB4ID0gbHg7IHggPD0gcng7ICsreCkKICAgICAgICAgICAgICAgIGZvciAoaW50IHkgPSBseTsgeSA8PSByeTsgKyt5KQogICAgICAgICAgICAgICAgICAgIHZhbHVlWysrcF0gPSBhW3hdW3ldOwoKICAgICAgICAgICAgc29ydCh2YWx1ZSArIDEsIHZhbHVlICsgcCArIDEpOwogICAgICAgICAgICBtYXhpbWl6ZShyZXMsIHZhbHVlWyhwICsgMSkgLyAyXSk7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiByZXM7Cn0KCi8vLyA9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PQoKaW50IHVzZWRbTElNICogTElNXTsKaW50IHN1YnRhc2s0KCkKewogICAgaW50IHRpbWVyID0gMDsKICAgIG1lbXNldCh1c2VkLCAwLCBzaXplb2YodXNlZCkpOwoKICAgIGludCByZXMgPSAwOwogICAgZm9yIChpbnQgbHggPSAxLCByeCA9IGg7IHJ4IDw9IHI7ICsrbHgsICsrcngpCiAgICB7CiAgICAgICAgZm9yIChpbnQgbHkgPSAxLCByeSA9IHc7IHJ5IDw9IGM7ICsrbHksICsrcnkpCiAgICAgICAgewogICAgICAgICAgICBpbnQgbW4gPSByICogYzsKICAgICAgICAgICAgaW50IG14ID0gMTsKICAgICAgICAgICAgKyt0aW1lcjsKICAgICAgICAgICAgZm9yIChpbnQgeCA9IGx4OyB4IDw9IHJ4OyArK3gpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGZvciAoaW50IHkgPSBseTsgeSA8PSByeTsgKyt5KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG1pbmltaXplKG1uLCBhW3hdW3ldKTsKICAgICAgICAgICAgICAgICAgICBtYXhpbWl6ZShteCwgYVt4XVt5XSk7CiAgICAgICAgICAgICAgICAgICAgdXNlZFthW3hdW3ldXSA9IHRpbWVyOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpbnQgY250ID0gKGggKiB3ICsgMSkgLyAyOwogICAgICAgICAgICBmb3IgKGludCB2ID0gbW47IHYgPD0gbXg7ICsrdikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHVzZWRbdl0gPT0gdGltZXIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKC0tY250ID09IDApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBtYXhpbWl6ZShyZXMsIHYpOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIHJlczsKfQoKCmludCBiaXRbTElNICogTElNXTsKdm9pZCBiaXRfY29uc3RydWN0KCkKewogICAgbWVtc2V0KGJpdCwgMCwgc2l6ZW9mKGJpdFswXSkgKiAociAqIGMgKyAxKSk7Cn0KCnZvaWQgYml0X3VwZGF0ZShpbnQgcCwgaW50IHYpCnsKICAgIGZvciAoOyBwIDw9IHIgKiBjOyBwICs9IHAgJiAtcCkKICAgICAgICBiaXRbcF0gKz0gdjsKfQoKaW50IGJpdF9xdWVyeShpbnQgcCkKewogICAgaW50IHJlcyA9IDA7CiAgICBmb3IgKDsgcCA+PSAxOyBwIC09IHAgJiAtcCkKICAgICAgICByZXMgKz0gYml0W3BdOwoKICAgIHJldHVybiByZXM7Cn0KCmludCBiaXRfbWVkaWFuKCkKewogICAgaW50IGV4cGVjdGVkID0gKGggKiB3ICsgMSkgLyAyOwogICAgaW50IHVwcGVyID0gciAqIGMgLSBleHBlY3RlZCArIDE7CiAgICBpbnQgbG93ZXIgPSBleHBlY3RlZDsKCiAgICBpbnQgcmVzID0gLTE7CiAgICBmb3IgKGludCBsID0gbG93ZXIsIHIgPSB1cHBlcjsgbCA8PSByOyApCiAgICB7CiAgICAgICAgaW50IG0gPSAobCArIHIpID4+IDE7CiAgICAgICAgaWYgKGJpdF9xdWVyeShtKSA+PSBleHBlY3RlZCkKICAgICAgICB7CiAgICAgICAgICAgIHJlcyA9IG07CiAgICAgICAgICAgIHIgPSBtIC0gMTsKICAgICAgICB9CiAgICAgICAgZWxzZSAKICAgICAgICB7CiAgICAgICAgICAgIGwgPSBtICsgMTsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIHJlczsKfQoKaW50IHN1YnRhc2s1KCkKewogICAgaW50IHJlcyA9IDA7CiAgICBmb3IgKGludCBseCA9IDEsIHJ4ID0gaDsgcnggPD0gcjsgKytseCwgKytyeCkKICAgIHsKICAgICAgICBiaXRfY29uc3RydWN0KCk7CiAgICAgICAgZm9yIChpbnQgeCA9IGx4OyB4IDw9IHJ4OyArK3gpCiAgICAgICAgICAgIGZvciAoaW50IHkgPSAxOyB5IDw9IHc7ICsreSkKICAgICAgICAgICAgICAgIGJpdF91cGRhdGUoYVt4XVt5XSwgKzEpOyAgIAoKICAgICAgICBmb3IgKGludCBseSA9IDEsIHJ5ID0gdzsgcnkgPD0gYzsgKytseSwgKytyeSkKICAgICAgICB7CiAgICAgICAgICAgIG1heGltaXplKHJlcywgYml0X21lZGlhbigpKTsKCiAgICAgICAgICAgIGlmIChyeSA9PSBjKSBicmVhazsKICAgICAgICAgICAgZm9yIChpbnQgeCA9IGx4OyB4IDw9IHJ4OyArK3gpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGJpdF91cGRhdGUoYVt4XVtseSArIDBdLCAtMSk7CiAgICAgICAgICAgICAgICBiaXRfdXBkYXRlKGFbeF1bcnkgKyAxXSwgKzEpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiByZXM7Cn0KCgppbnQgYml0MmRbTElNXVtMSU1dOwp2b2lkIGJpdDJkX2NvbnN0cnVjdCgpCnsKICAgIGZvciAoaW50IHggPSAxOyB4IDw9IHI7ICsreCkKICAgICAgICBtZW1zZXQoYml0MmRbeF0sIDAsIHNpemVvZihiaXQyZFt4XVswXSkgKiAoYyArIDEpKTsKfQoKdm9pZCBiaXQyZF91cGRhdGUoaW50IHgsIGludCB5LCBpbnQgdikKewogICAgZm9yIChpbnQgcCA9IHg7IHAgPD0gcjsgcCArPSBwICYgLXApCiAgICAgICAgZm9yIChpbnQgcSA9IHk7IHEgPD0gYzsgcSArPSBxICYgLXEpCiAgICAgICAgICAgIGJpdDJkW3BdW3FdICs9IHY7Cn0KCmludCBiaXQyZF9xdWVyeShpbnQgeCwgaW50IHkpCnsKICAgIGludCByZXMgPSAwOwogICAgZm9yIChpbnQgcCA9IHg7IHAgPj0gMTsgcCAtPSBwICYgLXApCiAgICAgICAgZm9yIChpbnQgcSA9IHk7IHEgPj0gMTsgcSAtPSBxICYgLXEpCiAgICAgICAgICAgIHJlcyArPSBiaXQyZFtwXVtxXTsKCiAgICByZXR1cm4gcmVzOwp9Cgp2b2lkIGJpdDJkX2FyZWFfdXBkYXRlKGludCB4LCBpbnQgeSwgaW50IHUsIGludCB2LCBpbnQgaykKewogICAgYml0MmRfdXBkYXRlKHUsIHYsICtrKTsKICAgIGJpdDJkX3VwZGF0ZSh1LCB5IC0gMSwgLWspOwogICAgYml0MmRfdXBkYXRlKHggLSAxLCB2LCAtayk7CiAgICBiaXQyZF91cGRhdGUoeCAtIDEsIHkgLSAxLCArayk7Cn0KCmludCBiaXQyZF9hcmVhX3F1ZXJ5KGludCB4LCBpbnQgeSwgaW50IHUsIGludCB2KQp7CiAgICBpbnQgcmVzID0gMDsKICAgIHJlcyArPSBiaXQyZF9xdWVyeSh1LCB2KTsKICAgIHJlcyAtPSBiaXQyZF9xdWVyeSh1LCB5IC0gMSk7CiAgICByZXMgLT0gYml0MmRfcXVlcnkoeCAtIDEsIHYpOwogICAgcmVzICs9IGJpdDJkX3F1ZXJ5KHggLSAxLCB5IC0gMSk7CiAgICByZXR1cm4gcmVzOwp9CgppbnQgdGVzdGluZyhpbnQgdmFsdWUsIGludCB0YXJnZXQpCnsKICAgIGJpdDJkX2NvbnN0cnVjdCgpOwogICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gcjsgKytpKQogICAgewogICAgICAgIGZvciAoaW50IGogPSAxOyBqIDw9IGM7ICsraikKICAgICAgICB7CiAgICAgICAgICAgIGlmIChhW2ldW2pdID49IHZhbHVlKQogICAgICAgICAgICAgICAgYml0MmRfdXBkYXRlKGksIGosICsxKTsKICAgICAgICAgICAgCiAgICAgICAgICAgIGlmIChpID49IGggJiYgaiA+PSB3KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpbnQgY250ID0gYml0MmRfYXJlYV9xdWVyeShpIC0gaCArIDEsIGogLSB3ICsgMSwgaSwgaik7CiAgICAgICAgICAgICAgICBpZiAoY250ID49IHRhcmdldCkKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gZmFsc2U7Cn0KCmludCBzdWJ0YXNrNigpCnsKICAgIGludCBleHBlY3RlZCA9IChoICogdyArIDEpIC8gMjsKICAgIGludCB1cHBlciA9IHIgKiBjIC0gZXhwZWN0ZWQgKyAxOwogICAgaW50IGxvd2VyID0gZXhwZWN0ZWQ7CgogICAgaW50IHJlcyA9IC0xOwogICAgZm9yIChpbnQgbCA9IGxvd2VyLCByID0gdXBwZXI7IGwgPD0gcjsgKQogICAgewogICAgICAgIGludCBtID0gKGwgKyByKSA+PiAxOwogICAgICAgIGlmICh0ZXN0aW5nKG0sIGV4cGVjdGVkKSkKICAgICAgICB7CiAgICAgICAgICAgIG1heGltaXplKHJlcywgbSk7CiAgICAgICAgICAgIGwgPSBtICsgMTsKICAgICAgICB9CiAgICAgICAgZWxzZSAKICAgICAgICB7CiAgICAgICAgICAgIHIgPSBtIC0gMTsKICAgICAgICB9CiAgICB9CiAgICAKICAgIHJldHVybiByZXM7Cn0KCmludCBiW0xJTV1bTElNXTsKaW50IGNoZWNrKGludCB2YWx1ZSwgaW50IHRhcmdldCkKewogICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gcjsgKytpKQogICAgewogICAgICAgIGZvciAoaW50IGogPSAxOyBqIDw9IGM7ICsraikKICAgICAgICB7CiAgICAgICAgICAgIGJbaV1bal0gPSBiW2kgLSAxXVtqXSArIGJbaV1baiAtIDFdIC0gYltpIC0gMV1baiAtIDFdOwogICAgICAgICAgICBiW2ldW2pdICs9IChhW2ldW2pdID49IHZhbHVlKTsKICAgICAgICB9CiAgICB9CgogICAgZm9yIChpbnQgbHggPSAxLCByeCA9IGg7IHJ4IDw9IHI7ICsrbHgsICsrcngpCiAgICB7CiAgICAgICAgZm9yIChpbnQgbHkgPSAxLCByeSA9IHc7IHJ5IDw9IGM7ICsrbHksICsrcnkpCiAgICAgICAgewogICAgICAgICAgICBpbnQgY250ID0gYltyeF1bcnldIC0gYltseCAtIDFdW3J5XSAtIGJbcnhdW2x5IC0gMV0gKyBiW2x4IC0gMV1bbHkgLSAxXTsKICAgICAgICAgICAgaWYgKGNudCA+PSB0YXJnZXQpCiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIGZhbHNlOwp9CgppbnQgc3VidGFzazcoKQp7CiAgICBpbnQgZXhwZWN0ZWQgPSAoaCAqIHcgKyAxKSAvIDI7CiAgICBpbnQgdXBwZXIgPSByICogYyAtIGV4cGVjdGVkICsgMTsKICAgIGludCBsb3dlciA9IGV4cGVjdGVkOwoKICAgIGludCByZXMgPSAtMTsKCiAgICBmb3IgKGludCBsID0gbG93ZXIsIHIgPSB1cHBlcjsgbCA8PSByOyApCiAgICB7CiAgICAgICAgaW50IG0gPSAobCArIHIpID4+IDE7CiAgICAgICAgaWYgKGNoZWNrKG0sIGV4cGVjdGVkKSkKICAgICAgICB7CiAgICAgICAgICAgIG1heGltaXplKHJlcywgbSk7CiAgICAgICAgICAgIGwgPSBtICsgMTsKICAgICAgICB9CiAgICAgICAgZWxzZSAKICAgICAgICB7CiAgICAgICAgICAgIHIgPSBtIC0gMTsKICAgICAgICB9CiAgICB9CiAgICAKICAgIHJldHVybiByZXM7Cn0KCmludCBtYWluKCkKewogICAgaW9zOjpzeW5jX3dpdGhfc3RkaW8oTlVMTCk7CiAgICBjaW4udGllKE5VTEwpOwoKICAgIGNpbiA+PiByID4+IGMgPj4gaCA+PiB3OwogICAgaWYgKGggPT0gMSAmJiB3ID09IDEpIHJldHVybiBjb3V0IDw8IHN1YnRhc2sxKCksIDA7CiAgICBpZiAoaCA9PSByICYmIHcgPT0gYykgcmV0dXJuIGNvdXQgPDwgc3VidGFzazIoKSwgMDsKICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IHI7ICsraSkKICAgICAgICBmb3IgKGludCBqID0gMTsgaiA8PSBjOyArK2opCiAgICAgICAgICAgIGNpbiA+PiBhW2ldW2pdOwoKICAgIGlmIChyIDw9ICAgMzAgJiYgYyA8PSAgIDMwKSByZXR1cm4gY291dCA8PCBzdWJ0YXNrMygpLCAwOwogICAgaWYgKHIgPD0gIDEwMCAmJiBjIDw9ICAxMDApIHJldHVybiBjb3V0IDw8IHN1YnRhc2s0KCksIDA7CiAgICBpZiAociA8PSAgMzAwICYmIGMgPD0gIDMwMCkgcmV0dXJuIGNvdXQgPDwgc3VidGFzazUoKSwgMDsKICAgIGlmIChyIDw9IDEwMDAgJiYgYyA8PSAxMDAwKSByZXR1cm4gY291dCA8PCBzdWJ0YXNrNigpLCAwOwogICAgaWYgKHIgPD0gMzAwMCAmJiBjIDw9IDMwMDApIHJldHVybiBjb3V0IDw8IHN1YnRhc2s3KCksIDA7CiAgICByZXR1cm4gMDsKfQ==