#include <bits/stdc++.h>
using namespace std;
using ll = long long;
static const ll NEG = -(1LL << 60);
struct Mat {
ll a[2][2];
};
struct SegTree {
int n;
vector<Mat> st;
vector<ll> *val;
vector<int> *rev;
static Mat mergeMat(const Mat &L, const Mat &R) {
Mat C;
for (int i = 0; i < 2; ++i)
for (int j = 0; j < 2; ++j)
C.a[i][j] = NEG;
for (int lf = 0; lf < 2; ++lf) {
for (int llv = 0; llv < 2; ++llv) {
if (L.a[lf][llv] == NEG) continue;
for (int rf = 0; rf < 2; ++rf) {
if (R.a[rf][0] == NEG && R.a[rf][1] == NEG) continue;
if (llv == 1 && rf == 1) continue;
for (int rl = 0; rl < 2; ++rl) {
if (R.a[rf][rl] == NEG) continue;
C.a[lf][rl] = max(C.a[lf][rl], L.a[lf][llv] + R.a[rf][rl]);
}
}
}
}
return C;
}
static Mat leaf(ll x) {
Mat m;
for (int i = 0; i < 2; ++i)
for (int j = 0; j < 2; ++j)
m.a[i][j] = NEG;
m.a[0][0] = 0;
m.a[1][1] = x;
return m;
}
void build(int idx, int l, int r) {
if (l == r) {
st[idx] = leaf((*val)[(*rev)[l]]);
return;
}
int mid = (l + r) >> 1;
build(idx << 1, l, mid);
build(idx << 1 | 1, mid + 1, r);
st[idx] = mergeMat(st[idx << 1], st[idx << 1 | 1]);
}
SegTree() {}
SegTree(int n, vector<ll> *val, vector<int> *rev) : n(n), val(val), rev(rev) {
st.resize(4 * n + 5);
build(1, 1, n);
}
void update(int idx, int l, int r, int pos) {
if (l == r) {
st[idx] = leaf((*val)[(*rev)[l]]);
return;
}
int mid = (l + r) >> 1;
if (pos <= mid) update(idx << 1, l, mid, pos);
else update(idx << 1 | 1, mid + 1, r, pos);
st[idx] = mergeMat(st[idx << 1], st[idx << 1 | 1]);
}
Mat query(int idx, int l, int r, int ql, int qr) {
if (qr < l || r < ql) {
Mat bad;
for (int i = 0; i < 2; ++i)
for (int j = 0; j < 2; ++j)
bad.a[i][j] = NEG;
return bad;
}
if (ql <= l && r <= qr) return st[idx];
int mid = (l + r) >> 1;
Mat L = query(idx << 1, l, mid, ql, qr);
Mat R = query(idx << 1 | 1, mid + 1, r, ql, qr);
if (L.a[0][0] == NEG && L.a[0][1] == NEG && L.a[1][0] == NEG && L.a[1][1] == NEG) return R;
if (R.a[0][0] == NEG && R.a[0][1] == NEG && R.a[1][0] == NEG && R.a[1][1] == NEG) return L;
return mergeMat(L, R);
}
};
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n, q;
cin >> n >> q;
vector<ll> a(n + 1);
for (int i = 1; i <= n; ++i) cin >> a[i];
vector<vector<int>> g(n + 1);
for (int i = 1; i <= n - 1; ++i) {
int u, v;
cin >> u >> v;
g[u].push_back(v);
g[v].push_back(u);
}
vector<int> parent(n + 1, 0), depth(n + 1, 0), heavy(n + 1, -1), sz(n + 1, 0);
vector<int> order;
order.reserve(n);
stack<int> st;
st.push(1);
parent[1] = 0;
depth[1] = 0;
while (!st.empty()) {
int u = st.top();
st.pop();
order.push_back(u);
for (int v : g[u]) {
if (v == parent[u]) continue;
parent[v] = u;
depth[v] = depth[u] + 1;
st.push(v);
}
}
for (int i = n - 1; i >= 0; --i) {
int u = order[i];
sz[u] = 1;
int best = -1;
for (int v : g[u]) {
if (v == parent[u]) continue;
sz[u] += sz[v];
if (best == -1 || sz[v] > sz[best]) best = v;
}
heavy[u] = best;
}
vector<int> head(n + 1, 0), pos(n + 1, 0), rev(n + 1, 0);
int cur = 0;
vector<pair<int,int>> chains;
chains.push_back({1, 1});
while (!chains.empty()) {
auto [u, h] = chains.back();
chains.pop_back();
for (int v = u; v != -1; v = heavy[v]) {
head[v] = h;
pos[v] = ++cur;
rev[cur] = v;
for (int to : g[v]) {
if (to == parent[v] || to == heavy[v]) continue;
chains.push_back({to, to});
}
}
}
SegTree seg(cur, &a, &rev);
auto revMat = [&](const Mat &m) {
Mat t;
t.a[0][0] = m.a[0][0];
t.a[0][1] = m.a[1][0];
t.a[1][0] = m.a[0][1];
t.a[1][1] = m.a[1][1];
return t;
};
auto queryRange = [&](int l, int r) {
return seg.query(1, 1, cur, l, r);
};
auto pathQuery = [&](int u, int v) {
vector<Mat> rightParts;
Mat ans;
bool has = false;
while (head[u] != head[v]) {
if (depth[head[u]] >= depth[head[v]]) {
Mat curMat = queryRange(pos[head[u]], pos[u]);
curMat = revMat(curMat);
if (!has) {
ans = curMat;
has = true;
} else {
ans = SegTree::mergeMat(ans, curMat);
}
u = parent[head[u]];
} else {
Mat curMat = queryRange(pos[head[v]], pos[v]);
rightParts.push_back(curMat);
v = parent[head[v]];
}
}
if (depth[u] >= depth[v]) {
Mat curMat = queryRange(pos[v], pos[u]);
curMat = revMat(curMat);
if (!has) {
ans = curMat;
has = true;
} else {
ans = SegTree::mergeMat(ans, curMat);
}
} else {
Mat curMat = queryRange(pos[u], pos[v]);
rightParts.push_back(curMat);
}
for (int i = (int)rightParts.size() - 1; i >= 0; --i) {
if (!has) {
ans = rightParts[i];
has = true;
} else {
ans = SegTree::mergeMat(ans, rightParts[i]);
}
}
ll best = 0;
for (int i = 0; i < 2; ++i)
for (int j = 0; j < 2; ++j)
best = max(best, ans.a[i][j]);
return best;
};
while (q--) {
int type;
cin >> type;
if (type == 1) {
int x;
ll y;
cin >> x >> y;
a[x] = y;
seg.update(1, 1, cur, pos[x]);
} else {
int u, v;
cin >> u >> v;
cout << pathQuery(u, v) << '\n';
}
}
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgp1c2luZyBsbCA9IGxvbmcgbG9uZzsKc3RhdGljIGNvbnN0IGxsIE5FRyA9IC0oMUxMIDw8IDYwKTsKCnN0cnVjdCBNYXQgewogICAgbGwgYVsyXVsyXTsKfTsKCnN0cnVjdCBTZWdUcmVlIHsKICAgIGludCBuOwogICAgdmVjdG9yPE1hdD4gc3Q7CiAgICB2ZWN0b3I8bGw+ICp2YWw7CiAgICB2ZWN0b3I8aW50PiAqcmV2OwoKICAgIHN0YXRpYyBNYXQgbWVyZ2VNYXQoY29uc3QgTWF0ICZMLCBjb25zdCBNYXQgJlIpIHsKICAgICAgICBNYXQgQzsKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDI7ICsraSkKICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCAyOyArK2opCiAgICAgICAgICAgICAgICBDLmFbaV1bal0gPSBORUc7CgogICAgICAgIGZvciAoaW50IGxmID0gMDsgbGYgPCAyOyArK2xmKSB7CiAgICAgICAgICAgIGZvciAoaW50IGxsdiA9IDA7IGxsdiA8IDI7ICsrbGx2KSB7CiAgICAgICAgICAgICAgICBpZiAoTC5hW2xmXVtsbHZdID09IE5FRykgY29udGludWU7CiAgICAgICAgICAgICAgICBmb3IgKGludCByZiA9IDA7IHJmIDwgMjsgKytyZikgewogICAgICAgICAgICAgICAgICAgIGlmIChSLmFbcmZdWzBdID09IE5FRyAmJiBSLmFbcmZdWzFdID09IE5FRykgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgaWYgKGxsdiA9PSAxICYmIHJmID09IDEpIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgIGZvciAoaW50IHJsID0gMDsgcmwgPCAyOyArK3JsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChSLmFbcmZdW3JsXSA9PSBORUcpIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICAgICBDLmFbbGZdW3JsXSA9IG1heChDLmFbbGZdW3JsXSwgTC5hW2xmXVtsbHZdICsgUi5hW3JmXVtybF0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gQzsKICAgIH0KCiAgICBzdGF0aWMgTWF0IGxlYWYobGwgeCkgewogICAgICAgIE1hdCBtOwogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgKytpKQogICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IDI7ICsraikKICAgICAgICAgICAgICAgIG0uYVtpXVtqXSA9IE5FRzsKICAgICAgICBtLmFbMF1bMF0gPSAwOwogICAgICAgIG0uYVsxXVsxXSA9IHg7CiAgICAgICAgcmV0dXJuIG07CiAgICB9CgogICAgdm9pZCBidWlsZChpbnQgaWR4LCBpbnQgbCwgaW50IHIpIHsKICAgICAgICBpZiAobCA9PSByKSB7CiAgICAgICAgICAgIHN0W2lkeF0gPSBsZWFmKCgqdmFsKVsoKnJldilbbF1dKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpbnQgbWlkID0gKGwgKyByKSA+PiAxOwogICAgICAgIGJ1aWxkKGlkeCA8PCAxLCBsLCBtaWQpOwogICAgICAgIGJ1aWxkKGlkeCA8PCAxIHwgMSwgbWlkICsgMSwgcik7CiAgICAgICAgc3RbaWR4XSA9IG1lcmdlTWF0KHN0W2lkeCA8PCAxXSwgc3RbaWR4IDw8IDEgfCAxXSk7CiAgICB9CgogICAgU2VnVHJlZSgpIHt9CiAgICBTZWdUcmVlKGludCBuLCB2ZWN0b3I8bGw+ICp2YWwsIHZlY3RvcjxpbnQ+ICpyZXYpIDogbihuKSwgdmFsKHZhbCksIHJldihyZXYpIHsKICAgICAgICBzdC5yZXNpemUoNCAqIG4gKyA1KTsKICAgICAgICBidWlsZCgxLCAxLCBuKTsKICAgIH0KCiAgICB2b2lkIHVwZGF0ZShpbnQgaWR4LCBpbnQgbCwgaW50IHIsIGludCBwb3MpIHsKICAgICAgICBpZiAobCA9PSByKSB7CiAgICAgICAgICAgIHN0W2lkeF0gPSBsZWFmKCgqdmFsKVsoKnJldilbbF1dKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpbnQgbWlkID0gKGwgKyByKSA+PiAxOwogICAgICAgIGlmIChwb3MgPD0gbWlkKSB1cGRhdGUoaWR4IDw8IDEsIGwsIG1pZCwgcG9zKTsKICAgICAgICBlbHNlIHVwZGF0ZShpZHggPDwgMSB8IDEsIG1pZCArIDEsIHIsIHBvcyk7CiAgICAgICAgc3RbaWR4XSA9IG1lcmdlTWF0KHN0W2lkeCA8PCAxXSwgc3RbaWR4IDw8IDEgfCAxXSk7CiAgICB9CgogICAgTWF0IHF1ZXJ5KGludCBpZHgsIGludCBsLCBpbnQgciwgaW50IHFsLCBpbnQgcXIpIHsKICAgICAgICBpZiAocXIgPCBsIHx8IHIgPCBxbCkgewogICAgICAgICAgICBNYXQgYmFkOwogICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDI7ICsraSkKICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgMjsgKytqKQogICAgICAgICAgICAgICAgICAgIGJhZC5hW2ldW2pdID0gTkVHOwogICAgICAgICAgICByZXR1cm4gYmFkOwogICAgICAgIH0KICAgICAgICBpZiAocWwgPD0gbCAmJiByIDw9IHFyKSByZXR1cm4gc3RbaWR4XTsKICAgICAgICBpbnQgbWlkID0gKGwgKyByKSA+PiAxOwogICAgICAgIE1hdCBMID0gcXVlcnkoaWR4IDw8IDEsIGwsIG1pZCwgcWwsIHFyKTsKICAgICAgICBNYXQgUiA9IHF1ZXJ5KGlkeCA8PCAxIHwgMSwgbWlkICsgMSwgciwgcWwsIHFyKTsKCiAgICAgICAgaWYgKEwuYVswXVswXSA9PSBORUcgJiYgTC5hWzBdWzFdID09IE5FRyAmJiBMLmFbMV1bMF0gPT0gTkVHICYmIEwuYVsxXVsxXSA9PSBORUcpIHJldHVybiBSOwogICAgICAgIGlmIChSLmFbMF1bMF0gPT0gTkVHICYmIFIuYVswXVsxXSA9PSBORUcgJiYgUi5hWzFdWzBdID09IE5FRyAmJiBSLmFbMV1bMV0gPT0gTkVHKSByZXR1cm4gTDsKICAgICAgICByZXR1cm4gbWVyZ2VNYXQoTCwgUik7CiAgICB9Cn07CgppbnQgbWFpbigpIHsKICAgIGlvczo6c3luY193aXRoX3N0ZGlvKGZhbHNlKTsKICAgIGNpbi50aWUobnVsbHB0cik7CgogICAgaW50IG4sIHE7CiAgICBjaW4gPj4gbiA+PiBxOwoKICAgIHZlY3RvcjxsbD4gYShuICsgMSk7CiAgICBmb3IgKGludCBpID0gMTsgaSA8PSBuOyArK2kpIGNpbiA+PiBhW2ldOwoKICAgIHZlY3Rvcjx2ZWN0b3I8aW50Pj4gZyhuICsgMSk7CiAgICBmb3IgKGludCBpID0gMTsgaSA8PSBuIC0gMTsgKytpKSB7CiAgICAgICAgaW50IHUsIHY7CiAgICAgICAgY2luID4+IHUgPj4gdjsKICAgICAgICBnW3VdLnB1c2hfYmFjayh2KTsKICAgICAgICBnW3ZdLnB1c2hfYmFjayh1KTsKICAgIH0KCiAgICB2ZWN0b3I8aW50PiBwYXJlbnQobiArIDEsIDApLCBkZXB0aChuICsgMSwgMCksIGhlYXZ5KG4gKyAxLCAtMSksIHN6KG4gKyAxLCAwKTsKICAgIHZlY3RvcjxpbnQ+IG9yZGVyOwogICAgb3JkZXIucmVzZXJ2ZShuKTsKCiAgICBzdGFjazxpbnQ+IHN0OwogICAgc3QucHVzaCgxKTsKICAgIHBhcmVudFsxXSA9IDA7CiAgICBkZXB0aFsxXSA9IDA7CgogICAgd2hpbGUgKCFzdC5lbXB0eSgpKSB7CiAgICAgICAgaW50IHUgPSBzdC50b3AoKTsKICAgICAgICBzdC5wb3AoKTsKICAgICAgICBvcmRlci5wdXNoX2JhY2sodSk7CiAgICAgICAgZm9yIChpbnQgdiA6IGdbdV0pIHsKICAgICAgICAgICAgaWYgKHYgPT0gcGFyZW50W3VdKSBjb250aW51ZTsKICAgICAgICAgICAgcGFyZW50W3ZdID0gdTsKICAgICAgICAgICAgZGVwdGhbdl0gPSBkZXB0aFt1XSArIDE7CiAgICAgICAgICAgIHN0LnB1c2godik7CiAgICAgICAgfQogICAgfQoKICAgIGZvciAoaW50IGkgPSBuIC0gMTsgaSA+PSAwOyAtLWkpIHsKICAgICAgICBpbnQgdSA9IG9yZGVyW2ldOwogICAgICAgIHN6W3VdID0gMTsKICAgICAgICBpbnQgYmVzdCA9IC0xOwogICAgICAgIGZvciAoaW50IHYgOiBnW3VdKSB7CiAgICAgICAgICAgIGlmICh2ID09IHBhcmVudFt1XSkgY29udGludWU7CiAgICAgICAgICAgIHN6W3VdICs9IHN6W3ZdOwogICAgICAgICAgICBpZiAoYmVzdCA9PSAtMSB8fCBzelt2XSA+IHN6W2Jlc3RdKSBiZXN0ID0gdjsKICAgICAgICB9CiAgICAgICAgaGVhdnlbdV0gPSBiZXN0OwogICAgfQoKICAgIHZlY3RvcjxpbnQ+IGhlYWQobiArIDEsIDApLCBwb3MobiArIDEsIDApLCByZXYobiArIDEsIDApOwogICAgaW50IGN1ciA9IDA7CiAgICB2ZWN0b3I8cGFpcjxpbnQsaW50Pj4gY2hhaW5zOwogICAgY2hhaW5zLnB1c2hfYmFjayh7MSwgMX0pOwoKICAgIHdoaWxlICghY2hhaW5zLmVtcHR5KCkpIHsKICAgICAgICBhdXRvIFt1LCBoXSA9IGNoYWlucy5iYWNrKCk7CiAgICAgICAgY2hhaW5zLnBvcF9iYWNrKCk7CgogICAgICAgIGZvciAoaW50IHYgPSB1OyB2ICE9IC0xOyB2ID0gaGVhdnlbdl0pIHsKICAgICAgICAgICAgaGVhZFt2XSA9IGg7CiAgICAgICAgICAgIHBvc1t2XSA9ICsrY3VyOwogICAgICAgICAgICByZXZbY3VyXSA9IHY7CgogICAgICAgICAgICBmb3IgKGludCB0byA6IGdbdl0pIHsKICAgICAgICAgICAgICAgIGlmICh0byA9PSBwYXJlbnRbdl0gfHwgdG8gPT0gaGVhdnlbdl0pIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgY2hhaW5zLnB1c2hfYmFjayh7dG8sIHRvfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgU2VnVHJlZSBzZWcoY3VyLCAmYSwgJnJldik7CgogICAgYXV0byByZXZNYXQgPSBbJl0oY29uc3QgTWF0ICZtKSB7CiAgICAgICAgTWF0IHQ7CiAgICAgICAgdC5hWzBdWzBdID0gbS5hWzBdWzBdOwogICAgICAgIHQuYVswXVsxXSA9IG0uYVsxXVswXTsKICAgICAgICB0LmFbMV1bMF0gPSBtLmFbMF1bMV07CiAgICAgICAgdC5hWzFdWzFdID0gbS5hWzFdWzFdOwogICAgICAgIHJldHVybiB0OwogICAgfTsKCiAgICBhdXRvIHF1ZXJ5UmFuZ2UgPSBbJl0oaW50IGwsIGludCByKSB7CiAgICAgICAgcmV0dXJuIHNlZy5xdWVyeSgxLCAxLCBjdXIsIGwsIHIpOwogICAgfTsKCiAgICBhdXRvIHBhdGhRdWVyeSA9IFsmXShpbnQgdSwgaW50IHYpIHsKICAgICAgICB2ZWN0b3I8TWF0PiByaWdodFBhcnRzOwogICAgICAgIE1hdCBhbnM7CiAgICAgICAgYm9vbCBoYXMgPSBmYWxzZTsKCiAgICAgICAgd2hpbGUgKGhlYWRbdV0gIT0gaGVhZFt2XSkgewogICAgICAgICAgICBpZiAoZGVwdGhbaGVhZFt1XV0gPj0gZGVwdGhbaGVhZFt2XV0pIHsKICAgICAgICAgICAgICAgIE1hdCBjdXJNYXQgPSBxdWVyeVJhbmdlKHBvc1toZWFkW3VdXSwgcG9zW3VdKTsKICAgICAgICAgICAgICAgIGN1ck1hdCA9IHJldk1hdChjdXJNYXQpOwogICAgICAgICAgICAgICAgaWYgKCFoYXMpIHsKICAgICAgICAgICAgICAgICAgICBhbnMgPSBjdXJNYXQ7CiAgICAgICAgICAgICAgICAgICAgaGFzID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgYW5zID0gU2VnVHJlZTo6bWVyZ2VNYXQoYW5zLCBjdXJNYXQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdSA9IHBhcmVudFtoZWFkW3VdXTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIE1hdCBjdXJNYXQgPSBxdWVyeVJhbmdlKHBvc1toZWFkW3ZdXSwgcG9zW3ZdKTsKICAgICAgICAgICAgICAgIHJpZ2h0UGFydHMucHVzaF9iYWNrKGN1ck1hdCk7CiAgICAgICAgICAgICAgICB2ID0gcGFyZW50W2hlYWRbdl1dOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoZGVwdGhbdV0gPj0gZGVwdGhbdl0pIHsKICAgICAgICAgICAgTWF0IGN1ck1hdCA9IHF1ZXJ5UmFuZ2UocG9zW3ZdLCBwb3NbdV0pOwogICAgICAgICAgICBjdXJNYXQgPSByZXZNYXQoY3VyTWF0KTsKICAgICAgICAgICAgaWYgKCFoYXMpIHsKICAgICAgICAgICAgICAgIGFucyA9IGN1ck1hdDsKICAgICAgICAgICAgICAgIGhhcyA9IHRydWU7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBhbnMgPSBTZWdUcmVlOjptZXJnZU1hdChhbnMsIGN1ck1hdCk7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBNYXQgY3VyTWF0ID0gcXVlcnlSYW5nZShwb3NbdV0sIHBvc1t2XSk7CiAgICAgICAgICAgIHJpZ2h0UGFydHMucHVzaF9iYWNrKGN1ck1hdCk7CiAgICAgICAgfQoKICAgICAgICBmb3IgKGludCBpID0gKGludClyaWdodFBhcnRzLnNpemUoKSAtIDE7IGkgPj0gMDsgLS1pKSB7CiAgICAgICAgICAgIGlmICghaGFzKSB7CiAgICAgICAgICAgICAgICBhbnMgPSByaWdodFBhcnRzW2ldOwogICAgICAgICAgICAgICAgaGFzID0gdHJ1ZTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGFucyA9IFNlZ1RyZWU6Om1lcmdlTWF0KGFucywgcmlnaHRQYXJ0c1tpXSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGxsIGJlc3QgPSAwOwogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgKytpKQogICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IDI7ICsraikKICAgICAgICAgICAgICAgIGJlc3QgPSBtYXgoYmVzdCwgYW5zLmFbaV1bal0pOwogICAgICAgIHJldHVybiBiZXN0OwogICAgfTsKCiAgICB3aGlsZSAocS0tKSB7CiAgICAgICAgaW50IHR5cGU7CiAgICAgICAgY2luID4+IHR5cGU7CiAgICAgICAgaWYgKHR5cGUgPT0gMSkgewogICAgICAgICAgICBpbnQgeDsKICAgICAgICAgICAgbGwgeTsKICAgICAgICAgICAgY2luID4+IHggPj4geTsKICAgICAgICAgICAgYVt4XSA9IHk7CiAgICAgICAgICAgIHNlZy51cGRhdGUoMSwgMSwgY3VyLCBwb3NbeF0pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGludCB1LCB2OwogICAgICAgICAgICBjaW4gPj4gdSA+PiB2OwogICAgICAgICAgICBjb3V0IDw8IHBhdGhRdWVyeSh1LCB2KSA8PCAnXG4nOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gMDsKfQo=