// #define ONLINE_JUDGE
#include "bits/stdc++.h"
using namespace std;
#if !defined(mhnd01s) || defined(ONLINE_JUDGE)
#define print(...) ((void)0)
#endif
using ll = long long;
void solve();
signed main() {
#ifdef mhnd01s
int x = mt19937(random_device()())()%100;printf("%d\n", x);
freopen("out", "wt", stdout);
#else
cin.tie(0)->sync_with_stdio(0);
#endif
cin.exceptions(cin.failbit);
int t = 1;
// cin >> t;
while(t--) {
solve();
if(t) cout << '\n';
}return 0;
}
struct segtreebeats {
static const ll INF = 2e18, UNSET = LLONG_MIN;
struct Node {
ll sum, mx1, mx2, mxc, mn1, mn2, mnc, d_gcd, lz_add, lz_set;
};
int sz;
vector<Node> tree;
inline ll absgcd(ll a, ll b) {
a = abs(a); b = abs(b);
while (b) { a %= b; swap(a, b); }
return a;
}
Node leaf(ll v) { return {v, v, -INF, 1, v, INF, 1, 0, 0, UNSET}; }
segtreebeats(int n, const vector<ll> &a) {
for (sz = 1; sz < n; sz <<= 1);
tree.assign(sz << 1, leaf(0));
build(a, n, 1, 0, sz - 1);
}
inline void pull(int x) {
int lc = x << 1, rc = x << 1 | 1;
auto &U = tree[x], &L = tree[lc], &R = tree[rc];
U.sum = L.sum + R.sum;
U.lz_add = 0; U.lz_set = UNSET;
if (L.mx1 == R.mx1) U.mx1 = L.mx1, U.mx2 = max(L.mx2, R.mx2), U.mxc = L.mxc + R.mxc;
else if (L.mx1 > R.mx1) U.mx1 = L.mx1, U.mx2 = max(L.mx2, R.mx1), U.mxc = L.mxc;
else U.mx1 = R.mx1, U.mx2 = max(L.mx1, R.mx2), U.mxc = R.mxc;
if (L.mn1 == R.mn1) U.mn1 = L.mn1, U.mn2 = min(L.mn2, R.mn2), U.mnc = L.mnc + R.mnc;
else if (L.mn1 < R.mn1) U.mn1 = L.mn1, U.mn2 = min(L.mn2, R.mn1), U.mnc = L.mnc;
else U.mn1 = R.mn1, U.mn2 = min(L.mn1, R.mn2), U.mnc = R.mnc;
U.d_gcd = absgcd(L.d_gcd, R.d_gcd);
ll aL = L.mx2, aR = R.mx2;
if (aL != -INF && aL != L.mn1 && aR != -INF && aR != R.mn1)
U.d_gcd = absgcd(U.d_gcd, aL - aR);
ll any = UNSET;
if (aL != -INF && aL != L.mn1) any = aL;
else if (aR != -INF && aR != R.mn1) any = aR;
ll vals[4] = {L.mn1, L.mx1, R.mn1, R.mx1};
for (int i = 0; i < 4; ++i) {
if (vals[i] != U.mn1 && vals[i] != U.mx1) {
if (any != UNSET) U.d_gcd = absgcd(U.d_gcd, vals[i] - any);
else any = vals[i];
}
}
}
inline void apply_set(int x, int lx, int rx, ll v) {
ll len = rx - lx + 1;
tree[x] = {len * v, v, -INF, len, v, INF, len, 0, 0, v};
}
inline void apply_add(int x, int lx, int rx, ll v) {
if (!v) return;
auto &nd = tree[x];
if (nd.lz_set != UNSET) return apply_set(x, lx, rx, nd.lz_set + v);
if (nd.mx1 == nd.mn1) return apply_set(x, lx, rx, nd.mn1 + v);
ll len = rx - lx + 1;
nd.sum += len * v;
nd.mx1 += v; if (nd.mx2 != -INF) nd.mx2 += v;
nd.mn1 += v; if (nd.mn2 != INF) nd.mn2 += v;
nd.lz_add += v;
}
inline void apply_chmin(int x, int lx, int rx, ll v) {
auto &nd = tree[x];
if (nd.mx1 <= v) return;
if (nd.mn1 >= v) return apply_set(x, lx, rx, v);
if (nd.mn2 == nd.mx1) nd.mn2 = v;
nd.sum -= (nd.mx1 - v) * nd.mxc;
nd.mx1 = v;
}
inline void apply_chmax(int x, int lx, int rx, ll v) {
auto &nd = tree[x];
if (nd.mn1 >= v) return;
if (nd.mx1 <= v) return apply_set(x, lx, rx, v);
if (nd.mx2 == nd.mn1) nd.mx2 = v;
nd.sum += (v - nd.mn1) * nd.mnc;
nd.mn1 = v;
}
inline void push(int x, int lx, int rx) {
if (lx == rx) return tree[x].lz_add = 0, tree[x].lz_set = UNSET, void();
int m = (lx + rx) >> 1, lc = x << 1, rc = x << 1 | 1;
if (tree[x].lz_set != UNSET) {
apply_set(lc, lx, m, tree[x].lz_set);
apply_set(rc, m + 1, rx, tree[x].lz_set);
tree[x].lz_set = UNSET;
}
if (tree[x].lz_add) {
apply_add(lc, lx, m, tree[x].lz_add);
apply_add(rc, m + 1, rx, tree[x].lz_add);
tree[x].lz_add = 0;
}
if (tree[lc].mx1 > tree[x].mx1) apply_chmin(lc, lx, m, tree[x].mx1);
if (tree[rc].mx1 > tree[x].mx1) apply_chmin(rc, m + 1, rx, tree[x].mx1);
if (tree[lc].mn1 < tree[x].mn1) apply_chmax(lc, lx, m, tree[x].mn1);
if (tree[rc].mn1 < tree[x].mn1) apply_chmax(rc, m + 1, rx, tree[x].mn1);
}
void build(const vector<ll> &a, int n, int x, int lx, int rx) {
if (lx == rx) return void(tree[x] = (lx < n) ? leaf(a[lx]) : leaf(0));
int m = (lx + rx) >> 1;
build(a, n, x << 1, lx, m);
build(a, n, x << 1 | 1, m + 1, rx);
pull(x);
}
void chmin(int l, int r, ll v, int x, int lx, int rx) {
if (lx > r || rx < l || tree[x].mx1 <= v) return;
if (lx >= l && rx <= r && tree[x].mx2 < v) return apply_chmin(x, lx, rx, v);
push(x, lx, rx);
int m = (lx + rx) >> 1;
chmin(l, r, v, x << 1, lx, m);
chmin(l, r, v, x << 1 | 1, m + 1, rx);
pull(x);
}
void chmax(int l, int r, ll v, int x, int lx, int rx) {
if (lx > r || rx < l || tree[x].mn1 >= v) return;
if (lx >= l && rx <= r && tree[x].mn2 > v) return apply_chmax(x, lx, rx, v);
push(x, lx, rx);
int m = (lx + rx) >> 1;
chmax(l, r, v, x << 1, lx, m);
chmax(l, r, v, x << 1 | 1, m + 1, rx);
pull(x);
}
void assign(int l, int r, ll v, int x, int lx, int rx) {
if (lx > r || rx < l) return;
if (lx >= l && rx <= r) return apply_set(x, lx, rx, v);
push(x, lx, rx);
int m = (lx + rx) >> 1;
assign(l, r, v, x << 1, lx, m);
assign(l, r, v, x << 1 | 1, m + 1, rx);
pull(x);
}
void add(int l, int r, ll v, int x, int lx, int rx) {
if (lx > r || rx < l) return;
if (lx >= l && rx <= r) return apply_add(x, lx, rx, v);
push(x, lx, rx);
int m = (lx + rx) >> 1;
add(l, r, v, x << 1, lx, m);
add(l, r, v, x << 1 | 1, m + 1, rx);
pull(x);
}
ll sum(int l, int r, int x, int lx, int rx) {
if (lx > r || rx < l) return 0;
if (lx >= l && rx <= r) return tree[x].sum;
push(x, lx, rx);
int m = (lx + rx) >> 1;
return sum(l, r, x << 1, lx, m) + sum(l, r, x << 1 | 1, m + 1, rx);
}
ll qmin(int l, int r, int x, int lx, int rx) {
if (lx > r || rx < l) return INF;
if (lx >= l && rx <= r) return tree[x].mn1;
push(x, lx, rx);
int m = (lx + rx) >> 1;
return min(qmin(l, r, x << 1, lx, m), qmin(l, r, x << 1 | 1, m + 1, rx));
}
ll qmax(int l, int r, int x, int lx, int rx) {
if (lx > r || rx < l) return -INF;
if (lx >= l && rx <= r) return tree[x].mx1;
push(x, lx, rx);
int m = (lx + rx) >> 1;
return max(qmax(l, r, x << 1, lx, m), qmax(l, r, x << 1 | 1, m + 1, rx));
}
ll qgcd(int l, int r, int x, int lx, int rx) {
if (lx > r || rx < l) return 0;
if (lx >= l && rx <= r) {
ll ans = absgcd(tree[x].d_gcd, tree[x].mx1);
if (tree[x].mx2 != -INF) ans = absgcd(ans, tree[x].mx2 - tree[x].mx1);
if (tree[x].mn2 != INF) ans = absgcd(ans, tree[x].mn2 - tree[x].mn1);
return ans;
}
push(x, lx, rx);
int m = (lx + rx) >> 1;
return absgcd(qgcd(l, r, x << 1, lx, m), qgcd(l, r, x << 1 | 1, m + 1, rx));
}
void chmin(int l, int r, ll v) { chmin(l, r, v, 1, 0, sz - 1); }
void chmax(int l, int r, ll v) { chmax(l, r, v, 1, 0, sz - 1); }
void assign(int l, int r, ll v) { assign(l, r, v, 1, 0, sz - 1); }
void add(int l, int r, ll v) { add(l, r, v, 1, 0, sz - 1); }
ll qsum(int l, int r) { return sum(l, r, 1, 0, sz - 1); }
ll qmin(int l, int r) { return qmin(l, r, 1, 0, sz - 1); }
ll qmax(int l, int r) { return qmax(l, r, 1, 0, sz - 1); }
ll qgcd(int l, int r) { return qgcd(l, r, 1, 0, sz - 1); }
};
void solve() {
int n, q; cin >> n;
vector<ll> v(n);
for (auto &i : v) cin >> i;
segtreebeats sgt(n, v);
cin >> q;
while (q--) {
int type; cin >> type;
if (type == 1) {
int l, r, x; cin >> l >> r >> x;
sgt.chmin(--l, --r, x);
} else if (type == 2) {
int l, r, x; cin >> l >> r >> x;
sgt.chmax(--l, --r, x);
} else if (type == 3) {
int l, r, x; cin >> l >> r >> x;
sgt.assign(--l, --r, x);
} else if (type == 4) {
int l, r, x; cin >> l >> r >> x;
sgt.add(--l, --r, x);
} else if (type == 5) {
int l, r; cin >> l >> r;
cout << sgt.qsum(--l, --r);
} else if (type == 6) {
int l, r; cin >> l >> r;
cout << sgt.qmin(--l, --r);
} else if (type == 7) {
int l, r; cin >> l >> r;
cout << sgt.qmax(--l, --r);
} else if (type == 8) {
int l, r; cin >> l >> r;
cout << sgt.qgcd(--l, --r);
}
cout << '\n';
}
}
Ly8gI2RlZmluZSBPTkxJTkVfSlVER0UKI2luY2x1ZGUgImJpdHMvc3RkYysrLmgiCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CiNpZiAhZGVmaW5lZChtaG5kMDFzKSB8fCBkZWZpbmVkKE9OTElORV9KVURHRSkKI2RlZmluZSBwcmludCguLi4pICgodm9pZCkwKQojZW5kaWYKdXNpbmcgbGwgPSBsb25nIGxvbmc7CnZvaWQgc29sdmUoKTsKc2lnbmVkIG1haW4oKSB7CiNpZmRlZiBtaG5kMDFzCiAgICBpbnQgeCA9IG10MTk5MzcocmFuZG9tX2RldmljZSgpKCkpKCklMTAwO3ByaW50ZigiJWRcbiIsIHgpOwogICAgZnJlb3Blbigib3V0IiwgInd0Iiwgc3Rkb3V0KTsKI2Vsc2UKICAgIGNpbi50aWUoMCktPnN5bmNfd2l0aF9zdGRpbygwKTsKI2VuZGlmCiAgICBjaW4uZXhjZXB0aW9ucyhjaW4uZmFpbGJpdCk7CiAgICBpbnQgdCA9IDE7CiAgICAvLyBjaW4gPj4gdDsKICAgIHdoaWxlKHQtLSkgewogICAgICAgIHNvbHZlKCk7CiAgICAgICAgaWYodCkgY291dCA8PCAnXG4nOwogICAgfXJldHVybiAwOwp9CgpzdHJ1Y3Qgc2VndHJlZWJlYXRzIHsKICAgIHN0YXRpYyBjb25zdCBsbCBJTkYgPSAyZTE4LCBVTlNFVCA9IExMT05HX01JTjsKCiAgICBzdHJ1Y3QgTm9kZSB7CiAgICAgICAgbGwgc3VtLCBteDEsIG14MiwgbXhjLCBtbjEsIG1uMiwgbW5jLCBkX2djZCwgbHpfYWRkLCBsel9zZXQ7CiAgICB9OwoKICAgIGludCBzejsKICAgIHZlY3RvcjxOb2RlPiB0cmVlOwoKICAgIGlubGluZSBsbCBhYnNnY2QobGwgYSwgbGwgYikgewogICAgICAgIGEgPSBhYnMoYSk7IGIgPSBhYnMoYik7CiAgICAgICAgd2hpbGUgKGIpIHsgYSAlPSBiOyBzd2FwKGEsIGIpOyB9CiAgICAgICAgcmV0dXJuIGE7CiAgICB9CgogICAgTm9kZSBsZWFmKGxsIHYpIHsgcmV0dXJuIHt2LCB2LCAtSU5GLCAxLCB2LCBJTkYsIDEsIDAsIDAsIFVOU0VUfTsgfQoKICAgIHNlZ3RyZWViZWF0cyhpbnQgbiwgY29uc3QgdmVjdG9yPGxsPiAmYSkgewogICAgICAgIGZvciAoc3ogPSAxOyBzeiA8IG47IHN6IDw8PSAxKTsKICAgICAgICB0cmVlLmFzc2lnbihzeiA8PCAxLCBsZWFmKDApKTsKICAgICAgICBidWlsZChhLCBuLCAxLCAwLCBzeiAtIDEpOwogICAgfQoKICAgIGlubGluZSB2b2lkIHB1bGwoaW50IHgpIHsKICAgICAgICBpbnQgbGMgPSB4IDw8IDEsIHJjID0geCA8PCAxIHwgMTsKICAgICAgICBhdXRvICZVID0gdHJlZVt4XSwgJkwgPSB0cmVlW2xjXSwgJlIgPSB0cmVlW3JjXTsKCiAgICAgICAgVS5zdW0gPSBMLnN1bSArIFIuc3VtOwogICAgICAgIFUubHpfYWRkID0gMDsgVS5sel9zZXQgPSBVTlNFVDsKCiAgICAgICAgaWYgKEwubXgxID09IFIubXgxKSBVLm14MSA9IEwubXgxLCBVLm14MiA9IG1heChMLm14MiwgUi5teDIpLCBVLm14YyA9IEwubXhjICsgUi5teGM7CiAgICAgICAgZWxzZSBpZiAoTC5teDEgPiBSLm14MSkgVS5teDEgPSBMLm14MSwgVS5teDIgPSBtYXgoTC5teDIsIFIubXgxKSwgVS5teGMgPSBMLm14YzsKICAgICAgICBlbHNlIFUubXgxID0gUi5teDEsIFUubXgyID0gbWF4KEwubXgxLCBSLm14MiksIFUubXhjID0gUi5teGM7CgogICAgICAgIGlmIChMLm1uMSA9PSBSLm1uMSkgVS5tbjEgPSBMLm1uMSwgVS5tbjIgPSBtaW4oTC5tbjIsIFIubW4yKSwgVS5tbmMgPSBMLm1uYyArIFIubW5jOwogICAgICAgIGVsc2UgaWYgKEwubW4xIDwgUi5tbjEpIFUubW4xID0gTC5tbjEsIFUubW4yID0gbWluKEwubW4yLCBSLm1uMSksIFUubW5jID0gTC5tbmM7CiAgICAgICAgZWxzZSBVLm1uMSA9IFIubW4xLCBVLm1uMiA9IG1pbihMLm1uMSwgUi5tbjIpLCBVLm1uYyA9IFIubW5jOwoKICAgICAgICBVLmRfZ2NkID0gYWJzZ2NkKEwuZF9nY2QsIFIuZF9nY2QpOwogICAgICAgIGxsIGFMID0gTC5teDIsIGFSID0gUi5teDI7CiAgICAgICAgaWYgKGFMICE9IC1JTkYgJiYgYUwgIT0gTC5tbjEgJiYgYVIgIT0gLUlORiAmJiBhUiAhPSBSLm1uMSkKICAgICAgICAgICAgVS5kX2djZCA9IGFic2djZChVLmRfZ2NkLCBhTCAtIGFSKTsKCiAgICAgICAgbGwgYW55ID0gVU5TRVQ7CiAgICAgICAgaWYgKGFMICE9IC1JTkYgJiYgYUwgIT0gTC5tbjEpIGFueSA9IGFMOwogICAgICAgIGVsc2UgaWYgKGFSICE9IC1JTkYgJiYgYVIgIT0gUi5tbjEpIGFueSA9IGFSOwoKICAgICAgICBsbCB2YWxzWzRdID0ge0wubW4xLCBMLm14MSwgUi5tbjEsIFIubXgxfTsKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDQ7ICsraSkgewogICAgICAgICAgICBpZiAodmFsc1tpXSAhPSBVLm1uMSAmJiB2YWxzW2ldICE9IFUubXgxKSB7CiAgICAgICAgICAgICAgICBpZiAoYW55ICE9IFVOU0VUKSBVLmRfZ2NkID0gYWJzZ2NkKFUuZF9nY2QsIHZhbHNbaV0gLSBhbnkpOwogICAgICAgICAgICAgICAgZWxzZSBhbnkgPSB2YWxzW2ldOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGlubGluZSB2b2lkIGFwcGx5X3NldChpbnQgeCwgaW50IGx4LCBpbnQgcngsIGxsIHYpIHsKICAgICAgICBsbCBsZW4gPSByeCAtIGx4ICsgMTsKICAgICAgICB0cmVlW3hdID0ge2xlbiAqIHYsIHYsIC1JTkYsIGxlbiwgdiwgSU5GLCBsZW4sIDAsIDAsIHZ9OwogICAgfQoKICAgIGlubGluZSB2b2lkIGFwcGx5X2FkZChpbnQgeCwgaW50IGx4LCBpbnQgcngsIGxsIHYpIHsKICAgICAgICBpZiAoIXYpIHJldHVybjsKICAgICAgICBhdXRvICZuZCA9IHRyZWVbeF07CiAgICAgICAgaWYgKG5kLmx6X3NldCAhPSBVTlNFVCkgcmV0dXJuIGFwcGx5X3NldCh4LCBseCwgcngsIG5kLmx6X3NldCArIHYpOwogICAgICAgIGlmIChuZC5teDEgPT0gbmQubW4xKSByZXR1cm4gYXBwbHlfc2V0KHgsIGx4LCByeCwgbmQubW4xICsgdik7CiAgICAgICAgbGwgbGVuID0gcnggLSBseCArIDE7CiAgICAgICAgbmQuc3VtICs9IGxlbiAqIHY7CiAgICAgICAgbmQubXgxICs9IHY7IGlmIChuZC5teDIgIT0gLUlORikgbmQubXgyICs9IHY7CiAgICAgICAgbmQubW4xICs9IHY7IGlmIChuZC5tbjIgIT0gSU5GKSBuZC5tbjIgKz0gdjsKICAgICAgICBuZC5sel9hZGQgKz0gdjsKICAgIH0KCiAgICBpbmxpbmUgdm9pZCBhcHBseV9jaG1pbihpbnQgeCwgaW50IGx4LCBpbnQgcngsIGxsIHYpIHsKICAgICAgICBhdXRvICZuZCA9IHRyZWVbeF07CiAgICAgICAgaWYgKG5kLm14MSA8PSB2KSByZXR1cm47CiAgICAgICAgaWYgKG5kLm1uMSA+PSB2KSByZXR1cm4gYXBwbHlfc2V0KHgsIGx4LCByeCwgdik7CiAgICAgICAgaWYgKG5kLm1uMiA9PSBuZC5teDEpIG5kLm1uMiA9IHY7CiAgICAgICAgbmQuc3VtIC09IChuZC5teDEgLSB2KSAqIG5kLm14YzsKICAgICAgICBuZC5teDEgPSB2OwogICAgfQoKICAgIGlubGluZSB2b2lkIGFwcGx5X2NobWF4KGludCB4LCBpbnQgbHgsIGludCByeCwgbGwgdikgewogICAgICAgIGF1dG8gJm5kID0gdHJlZVt4XTsKICAgICAgICBpZiAobmQubW4xID49IHYpIHJldHVybjsKICAgICAgICBpZiAobmQubXgxIDw9IHYpIHJldHVybiBhcHBseV9zZXQoeCwgbHgsIHJ4LCB2KTsKICAgICAgICBpZiAobmQubXgyID09IG5kLm1uMSkgbmQubXgyID0gdjsKICAgICAgICBuZC5zdW0gKz0gKHYgLSBuZC5tbjEpICogbmQubW5jOwogICAgICAgIG5kLm1uMSA9IHY7CiAgICB9CgogICAgaW5saW5lIHZvaWQgcHVzaChpbnQgeCwgaW50IGx4LCBpbnQgcngpIHsKICAgICAgICBpZiAobHggPT0gcngpIHJldHVybiB0cmVlW3hdLmx6X2FkZCA9IDAsIHRyZWVbeF0ubHpfc2V0ID0gVU5TRVQsIHZvaWQoKTsKICAgICAgICBpbnQgbSA9IChseCArIHJ4KSA+PiAxLCBsYyA9IHggPDwgMSwgcmMgPSB4IDw8IDEgfCAxOwoKICAgICAgICBpZiAodHJlZVt4XS5sel9zZXQgIT0gVU5TRVQpIHsKICAgICAgICAgICAgYXBwbHlfc2V0KGxjLCBseCwgbSwgdHJlZVt4XS5sel9zZXQpOwogICAgICAgICAgICBhcHBseV9zZXQocmMsIG0gKyAxLCByeCwgdHJlZVt4XS5sel9zZXQpOwogICAgICAgICAgICB0cmVlW3hdLmx6X3NldCA9IFVOU0VUOwogICAgICAgIH0KICAgICAgICBpZiAodHJlZVt4XS5sel9hZGQpIHsKICAgICAgICAgICAgYXBwbHlfYWRkKGxjLCBseCwgbSwgdHJlZVt4XS5sel9hZGQpOwogICAgICAgICAgICBhcHBseV9hZGQocmMsIG0gKyAxLCByeCwgdHJlZVt4XS5sel9hZGQpOwogICAgICAgICAgICB0cmVlW3hdLmx6X2FkZCA9IDA7CiAgICAgICAgfQogICAgICAgIGlmICh0cmVlW2xjXS5teDEgPiB0cmVlW3hdLm14MSkgYXBwbHlfY2htaW4obGMsIGx4LCBtLCB0cmVlW3hdLm14MSk7CiAgICAgICAgaWYgKHRyZWVbcmNdLm14MSA+IHRyZWVbeF0ubXgxKSBhcHBseV9jaG1pbihyYywgbSArIDEsIHJ4LCB0cmVlW3hdLm14MSk7CiAgICAgICAgaWYgKHRyZWVbbGNdLm1uMSA8IHRyZWVbeF0ubW4xKSBhcHBseV9jaG1heChsYywgbHgsIG0sIHRyZWVbeF0ubW4xKTsKICAgICAgICBpZiAodHJlZVtyY10ubW4xIDwgdHJlZVt4XS5tbjEpIGFwcGx5X2NobWF4KHJjLCBtICsgMSwgcngsIHRyZWVbeF0ubW4xKTsKICAgIH0KCiAgICB2b2lkIGJ1aWxkKGNvbnN0IHZlY3RvcjxsbD4gJmEsIGludCBuLCBpbnQgeCwgaW50IGx4LCBpbnQgcngpIHsKICAgICAgICBpZiAobHggPT0gcngpIHJldHVybiB2b2lkKHRyZWVbeF0gPSAobHggPCBuKSA/IGxlYWYoYVtseF0pIDogbGVhZigwKSk7CiAgICAgICAgaW50IG0gPSAobHggKyByeCkgPj4gMTsKICAgICAgICBidWlsZChhLCBuLCB4IDw8IDEsIGx4LCBtKTsKICAgICAgICBidWlsZChhLCBuLCB4IDw8IDEgfCAxLCBtICsgMSwgcngpOwogICAgICAgIHB1bGwoeCk7CiAgICB9CgogICAgdm9pZCBjaG1pbihpbnQgbCwgaW50IHIsIGxsIHYsIGludCB4LCBpbnQgbHgsIGludCByeCkgewogICAgICAgIGlmIChseCA+IHIgfHwgcnggPCBsIHx8IHRyZWVbeF0ubXgxIDw9IHYpIHJldHVybjsKICAgICAgICBpZiAobHggPj0gbCAmJiByeCA8PSByICYmIHRyZWVbeF0ubXgyIDwgdikgcmV0dXJuIGFwcGx5X2NobWluKHgsIGx4LCByeCwgdik7CiAgICAgICAgcHVzaCh4LCBseCwgcngpOwogICAgICAgIGludCBtID0gKGx4ICsgcngpID4+IDE7CiAgICAgICAgY2htaW4obCwgciwgdiwgeCA8PCAxLCBseCwgbSk7CiAgICAgICAgY2htaW4obCwgciwgdiwgeCA8PCAxIHwgMSwgbSArIDEsIHJ4KTsKICAgICAgICBwdWxsKHgpOwogICAgfQoKICAgIHZvaWQgY2htYXgoaW50IGwsIGludCByLCBsbCB2LCBpbnQgeCwgaW50IGx4LCBpbnQgcngpIHsKICAgICAgICBpZiAobHggPiByIHx8IHJ4IDwgbCB8fCB0cmVlW3hdLm1uMSA+PSB2KSByZXR1cm47CiAgICAgICAgaWYgKGx4ID49IGwgJiYgcnggPD0gciAmJiB0cmVlW3hdLm1uMiA+IHYpIHJldHVybiBhcHBseV9jaG1heCh4LCBseCwgcngsIHYpOwogICAgICAgIHB1c2goeCwgbHgsIHJ4KTsKICAgICAgICBpbnQgbSA9IChseCArIHJ4KSA+PiAxOwogICAgICAgIGNobWF4KGwsIHIsIHYsIHggPDwgMSwgbHgsIG0pOwogICAgICAgIGNobWF4KGwsIHIsIHYsIHggPDwgMSB8IDEsIG0gKyAxLCByeCk7CiAgICAgICAgcHVsbCh4KTsKICAgIH0KCiAgICB2b2lkIGFzc2lnbihpbnQgbCwgaW50IHIsIGxsIHYsIGludCB4LCBpbnQgbHgsIGludCByeCkgewogICAgICAgIGlmIChseCA+IHIgfHwgcnggPCBsKSByZXR1cm47CiAgICAgICAgaWYgKGx4ID49IGwgJiYgcnggPD0gcikgcmV0dXJuIGFwcGx5X3NldCh4LCBseCwgcngsIHYpOwogICAgICAgIHB1c2goeCwgbHgsIHJ4KTsKICAgICAgICBpbnQgbSA9IChseCArIHJ4KSA+PiAxOwogICAgICAgIGFzc2lnbihsLCByLCB2LCB4IDw8IDEsIGx4LCBtKTsKICAgICAgICBhc3NpZ24obCwgciwgdiwgeCA8PCAxIHwgMSwgbSArIDEsIHJ4KTsKICAgICAgICBwdWxsKHgpOwogICAgfQoKICAgIHZvaWQgYWRkKGludCBsLCBpbnQgciwgbGwgdiwgaW50IHgsIGludCBseCwgaW50IHJ4KSB7CiAgICAgICAgaWYgKGx4ID4gciB8fCByeCA8IGwpIHJldHVybjsKICAgICAgICBpZiAobHggPj0gbCAmJiByeCA8PSByKSByZXR1cm4gYXBwbHlfYWRkKHgsIGx4LCByeCwgdik7CiAgICAgICAgcHVzaCh4LCBseCwgcngpOwogICAgICAgIGludCBtID0gKGx4ICsgcngpID4+IDE7CiAgICAgICAgYWRkKGwsIHIsIHYsIHggPDwgMSwgbHgsIG0pOwogICAgICAgIGFkZChsLCByLCB2LCB4IDw8IDEgfCAxLCBtICsgMSwgcngpOwogICAgICAgIHB1bGwoeCk7CiAgICB9CgogICAgbGwgc3VtKGludCBsLCBpbnQgciwgaW50IHgsIGludCBseCwgaW50IHJ4KSB7CiAgICAgICAgaWYgKGx4ID4gciB8fCByeCA8IGwpIHJldHVybiAwOwogICAgICAgIGlmIChseCA+PSBsICYmIHJ4IDw9IHIpIHJldHVybiB0cmVlW3hdLnN1bTsKICAgICAgICBwdXNoKHgsIGx4LCByeCk7CiAgICAgICAgaW50IG0gPSAobHggKyByeCkgPj4gMTsKICAgICAgICByZXR1cm4gc3VtKGwsIHIsIHggPDwgMSwgbHgsIG0pICsgc3VtKGwsIHIsIHggPDwgMSB8IDEsIG0gKyAxLCByeCk7CiAgICB9CgogICAgbGwgcW1pbihpbnQgbCwgaW50IHIsIGludCB4LCBpbnQgbHgsIGludCByeCkgewogICAgICAgIGlmIChseCA+IHIgfHwgcnggPCBsKSByZXR1cm4gSU5GOwogICAgICAgIGlmIChseCA+PSBsICYmIHJ4IDw9IHIpIHJldHVybiB0cmVlW3hdLm1uMTsKICAgICAgICBwdXNoKHgsIGx4LCByeCk7CiAgICAgICAgaW50IG0gPSAobHggKyByeCkgPj4gMTsKICAgICAgICByZXR1cm4gbWluKHFtaW4obCwgciwgeCA8PCAxLCBseCwgbSksIHFtaW4obCwgciwgeCA8PCAxIHwgMSwgbSArIDEsIHJ4KSk7CiAgICB9CgogICAgbGwgcW1heChpbnQgbCwgaW50IHIsIGludCB4LCBpbnQgbHgsIGludCByeCkgewogICAgICAgIGlmIChseCA+IHIgfHwgcnggPCBsKSByZXR1cm4gLUlORjsKICAgICAgICBpZiAobHggPj0gbCAmJiByeCA8PSByKSByZXR1cm4gdHJlZVt4XS5teDE7CiAgICAgICAgcHVzaCh4LCBseCwgcngpOwogICAgICAgIGludCBtID0gKGx4ICsgcngpID4+IDE7CiAgICAgICAgcmV0dXJuIG1heChxbWF4KGwsIHIsIHggPDwgMSwgbHgsIG0pLCBxbWF4KGwsIHIsIHggPDwgMSB8IDEsIG0gKyAxLCByeCkpOwogICAgfQoKICAgIGxsIHFnY2QoaW50IGwsIGludCByLCBpbnQgeCwgaW50IGx4LCBpbnQgcngpIHsKICAgICAgICBpZiAobHggPiByIHx8IHJ4IDwgbCkgcmV0dXJuIDA7CiAgICAgICAgaWYgKGx4ID49IGwgJiYgcnggPD0gcikgewogICAgICAgICAgICBsbCBhbnMgPSBhYnNnY2QodHJlZVt4XS5kX2djZCwgdHJlZVt4XS5teDEpOwogICAgICAgICAgICBpZiAodHJlZVt4XS5teDIgIT0gLUlORikgYW5zID0gYWJzZ2NkKGFucywgdHJlZVt4XS5teDIgLSB0cmVlW3hdLm14MSk7CiAgICAgICAgICAgIGlmICh0cmVlW3hdLm1uMiAhPSBJTkYpIGFucyA9IGFic2djZChhbnMsIHRyZWVbeF0ubW4yIC0gdHJlZVt4XS5tbjEpOwogICAgICAgICAgICByZXR1cm4gYW5zOwogICAgICAgIH0KICAgICAgICBwdXNoKHgsIGx4LCByeCk7CiAgICAgICAgaW50IG0gPSAobHggKyByeCkgPj4gMTsKICAgICAgICByZXR1cm4gYWJzZ2NkKHFnY2QobCwgciwgeCA8PCAxLCBseCwgbSksIHFnY2QobCwgciwgeCA8PCAxIHwgMSwgbSArIDEsIHJ4KSk7CiAgICB9CgogICAgdm9pZCBjaG1pbihpbnQgbCwgaW50IHIsIGxsIHYpIHsgY2htaW4obCwgciwgdiwgMSwgMCwgc3ogLSAxKTsgfQogICAgdm9pZCBjaG1heChpbnQgbCwgaW50IHIsIGxsIHYpIHsgY2htYXgobCwgciwgdiwgMSwgMCwgc3ogLSAxKTsgfQogICAgdm9pZCBhc3NpZ24oaW50IGwsIGludCByLCBsbCB2KSB7IGFzc2lnbihsLCByLCB2LCAxLCAwLCBzeiAtIDEpOyB9CiAgICB2b2lkIGFkZChpbnQgbCwgaW50IHIsIGxsIHYpIHsgYWRkKGwsIHIsIHYsIDEsIDAsIHN6IC0gMSk7IH0KICAgIGxsIHFzdW0oaW50IGwsIGludCByKSB7IHJldHVybiBzdW0obCwgciwgMSwgMCwgc3ogLSAxKTsgfQogICAgbGwgcW1pbihpbnQgbCwgaW50IHIpIHsgcmV0dXJuIHFtaW4obCwgciwgMSwgMCwgc3ogLSAxKTsgfQogICAgbGwgcW1heChpbnQgbCwgaW50IHIpIHsgcmV0dXJuIHFtYXgobCwgciwgMSwgMCwgc3ogLSAxKTsgfQogICAgbGwgcWdjZChpbnQgbCwgaW50IHIpIHsgcmV0dXJuIHFnY2QobCwgciwgMSwgMCwgc3ogLSAxKTsgfQp9OwoKdm9pZCBzb2x2ZSgpIHsKICAgIGludCBuLCBxOyBjaW4gPj4gbjsKICAgIHZlY3RvcjxsbD4gdihuKTsKICAgIGZvciAoYXV0byAmaSA6IHYpIGNpbiA+PiBpOwogICAgc2VndHJlZWJlYXRzIHNndChuLCB2KTsKICAgIGNpbiA+PiBxOwogICAgd2hpbGUgKHEtLSkgewogICAgICAgIGludCB0eXBlOyBjaW4gPj4gdHlwZTsKICAgICAgICBpZiAodHlwZSA9PSAxKSB7CiAgICAgICAgICAgIGludCBsLCByLCB4OyBjaW4gPj4gbCA+PiByID4+IHg7CiAgICAgICAgICAgIHNndC5jaG1pbigtLWwsIC0tciwgeCk7CiAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IDIpIHsKICAgICAgICAgICAgaW50IGwsIHIsIHg7IGNpbiA+PiBsID4+IHIgPj4geDsKICAgICAgICAgICAgc2d0LmNobWF4KC0tbCwgLS1yLCB4KTsKICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gMykgewogICAgICAgICAgICBpbnQgbCwgciwgeDsgY2luID4+IGwgPj4gciA+PiB4OwogICAgICAgICAgICBzZ3QuYXNzaWduKC0tbCwgLS1yLCB4KTsKICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gNCkgewogICAgICAgICAgICBpbnQgbCwgciwgeDsgY2luID4+IGwgPj4gciA+PiB4OwogICAgICAgICAgICBzZ3QuYWRkKC0tbCwgLS1yLCB4KTsKICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gNSkgewogICAgICAgICAgICBpbnQgbCwgcjsgY2luID4+IGwgPj4gcjsKICAgICAgICAgICAgY291dCA8PCBzZ3QucXN1bSgtLWwsIC0tcik7CiAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IDYpIHsKICAgICAgICAgICAgaW50IGwsIHI7IGNpbiA+PiBsID4+IHI7CiAgICAgICAgICAgIGNvdXQgPDwgc2d0LnFtaW4oLS1sLCAtLXIpOwogICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSA3KSB7CiAgICAgICAgICAgIGludCBsLCByOyBjaW4gPj4gbCA+PiByOwogICAgICAgICAgICBjb3V0IDw8IHNndC5xbWF4KC0tbCwgLS1yKTsKICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gOCkgewogICAgICAgICAgICBpbnQgbCwgcjsgY2luID4+IGwgPj4gcjsKICAgICAgICAgICAgY291dCA8PCBzZ3QucWdjZCgtLWwsIC0tcik7CiAgICAgICAgfQogICAgICAgIGNvdXQgPDwgJ1xuJzsKICAgIH0KfQ==