//#pragma GCC optimize("Ofast,unroll-loops")
//#pragma GCC target("avx2,tune=native")
#include <bits/stdc++.h>
using namespace std;
#define file "o"
#define ff(i, a, b) for(auto i=(a); i<=(b); ++i)
#define ffr(i, b, a) for(auto i=(b); i>=(a); --i)
#define nl "\n"
#define ss " "
#define pb emplace_back
#define fi first
#define se second
#define sz(s) (int)s.size()
#define all(s) (s).begin(), (s).end()
#define ms(a,x) memset(a, x, sizeof (a))
#define cn continue
#define re exit(0)
typedef long long ll;
typedef vector<int> vi;
const int maxn = 400000 + 15;
const ll INF = (ll)4e18;
int n, m;
int st[maxn], ed[maxn], timer=0;
int st2[maxn], tour2[20][maxn*2], timer2=0;
int h[maxn];
vi g[maxn], ng[maxn], c[maxn], cur;
ll ans[maxn], dff[maxn];
int node_at_tin[maxn];
// compute subtree size quickly as ed - st + 1
void dfs(int u, int par)
{
st[u]=++timer;
st2[u]=++timer2; tour2[0][timer2]=u;
for(auto v:g[u]) if(v!=par)
{
h[v]=h[u]+1;
dfs(v, u);
tour2[0][++timer2]=u;
}
ed[u]=timer;
}
void pre()
{
int LOG = 19;
ff(j, 1, LOG) ff(i, 1, timer2-(1<<j)+1)
{
int u=tour2[j-1][i], v=tour2[j-1][i+(1<<(j-1))];
if(h[u]<h[v]) tour2[j][i]=u;
else tour2[j][i]=v;
}
}
inline int lca(int u, int v)
{
int l=st2[u], r=st2[v];
if (l>r) swap(l, r);
int k=31-__builtin_clz(r-l+1);
int a = tour2[k][l], b = tour2[k][r-(1<<k)+1];
if(h[a] < h[b]) return a;
else return b;
}
inline bool cmp_tin(int u, int v)
{
return st[u] < st[v];
}
inline bool child_of(int u, int v)
{
return st[u] <= st[v] && ed[v] <= ed[u];
}
inline void upd(int l, int r, ll val)
{
if (l>r) return;
dff[l] += val;
dff[r+1] -= val;
}
void build_virtual()
{
sort(all(cur), cmp_tin);
int k = sz(cur);
// add LCAs of consecutive
for (int i = 0; i+1 < k; ++i) cur.pb(lca(cur[i], cur[i+1]));
sort(all(cur), cmp_tin);
cur.erase(unique(all(cur)), cur.end());
// clear adjacency
for (int x : cur) ng[x].clear();
// build with stack
vector<int> stck;
stck.reserve(sz(cur));
stck.push_back(cur[0]);
for (int i = 1; i < sz(cur); ++i)
{
int v = cur[i];
while (!child_of(stck.back(), v)) {
int u = stck.back(); stck.pop_back();
ng[stck.back()].pb(u);
}
stck.push_back(v);
}
while (sz(stck) > 1) {
int u = stck.back(); stck.pop_back();
ng[stck.back()].pb(u);
}
}
int cnt_in_subtree(const vi &vec, int v)
{
// vec sorted by tin
auto lo = lower_bound(vec.begin(), vec.end(), st[v], [&](int node, int value){ return st[node] < value; });
auto hi = upper_bound(vec.begin(), vec.end(), ed[v], [&](int value, int node){ return value < st[node]; });
return int(hi - lo);
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr); cout.tie(nullptr);
if (fopen(file".inp","r")) {
freopen(file".inp","r",stdin);
freopen(file".out","w",stdout);
}
int sub; if(!(cin>>sub)) return 0;
cin >> n >> m;
ff(i,1,n){
int x; cin >> x; c[x].pb(i);
}
ff(i,1,n-1){
int u,v,w; cin >> u >> v >> w;
g[u].pb(v); g[v].pb(u);
}
// preprocess
timer = 0; timer2 = 0;
h[1] = 0;
dfs(1, 0);
pre();
// build inverse tin
ff(i,1,n) node_at_tin[st[i]] = i;
// mark array for colored nodes per color
static int is_col[maxn];
ms(is_col, 0);
ms(dff, 0);
// process each color
for (int col = 1; col <= n; ++col)
{
if (c[col].empty()) continue;
// vec: original colored nodes sorted by tin
vi vec = c[col];
sort(all(vec), cmp_tin);
// prepare cur = vec (will be appended LCAs inside build_virtual)
cur.clear();
for (int x : vec) cur.pb(x);
// mark colored nodes
for (int x : vec) is_col[x] = 1;
// build virtual tree (ng adjacency filled, cur updated)
build_virtual();
// iterate virtual nodes in cur and compute contributions
for (int v : cur)
{
// sum sizes of virtual children
ll sum_ch = 0;
for (int ch : ng[v]) {
int subch = ed[ch] - st[ch] + 1;
sum_ch += subch;
}
bool v_is_col = is_col[v];
int sub_v = ed[v] - st[v] + 1;
if (!v_is_col)
{
// one block: subtree[v] minus children's subtrees
ll block_sz = (ll)sub_v - sum_ch;
if (block_sz > 0)
{
ll val = (ll)n - block_sz;
// add val to subtree[v]
upd(st[v], ed[v], val);
// subtract val from each child subtree
for (int ch : ng[v]) upd(st[ch], ed[ch], -val);
}
}
else
{
// v is colored: each neighbor-side that contains 0 colored nodes is a block
// iterate original neighbors
for (int to : g[v])
{
if (child_of(to, v)) {
// to is ancestor of v -> parent side; shouldn't happen because child_of(to,v) means to is ancestor of v
// but in tree adjacency, either to is child of v or parent of v
}
if (child_of(v, to)) {
// 'to' is child of v in original rooted tree
int cntcol = cnt_in_subtree(vec, to);
int side_sz = ed[to] - st[to] + 1;
if (cntcol == 0) {
ll val = (ll)n - side_sz;
upd(st[to], ed[to], val);
}
} else {
// 'to' is parent side (outside subtree v)
int total_col = sz(vec);
int inside_v = cnt_in_subtree(vec, v);
int outside_col = total_col - inside_v;
int side_sz = n - sub_v;
if (outside_col == 0 && side_sz > 0) {
ll val = (ll)n - side_sz;
// outside subtree: two intervals [1, st[v]-1] and [ed[v]+1, n]
if (st[v] > 1) upd(1, st[v]-1, val);
if (ed[v] < n) upd(ed[v]+1, n, val);
}
}
}
// colored node itself: every path to any node contains its own color
upd(st[v], st[v], (ll)n);
}
}
// cleanup marks
for (int x : vec) is_col[x] = 0;
}
// accumulate diff to ans
ll curv = 0;
ff(t,1,n)
{
curv += dff[t];
ans[node_at_tin[t]] = curv;
}
// print answers
ff(i,1,n)
{
if (i>1) cout << ' ';
cout << ans[i];
}
cout << '\n';
return 0;
}
Ly8jcHJhZ21hIEdDQyBvcHRpbWl6ZSgiT2Zhc3QsdW5yb2xsLWxvb3BzIikKLy8jcHJhZ21hIEdDQyB0YXJnZXQoImF2eDIsdHVuZT1uYXRpdmUiKQojaW5jbHVkZSA8Yml0cy9zdGRjKysuaD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCiNkZWZpbmUgZmlsZSAibyIKI2RlZmluZSBmZihpLCBhLCBiKSBmb3IoYXV0byBpPShhKTsgaTw9KGIpOyArK2kpCiNkZWZpbmUgZmZyKGksIGIsIGEpIGZvcihhdXRvIGk9KGIpOyBpPj0oYSk7IC0taSkKI2RlZmluZSBubCAiXG4iCiNkZWZpbmUgc3MgIiAiCiNkZWZpbmUgcGIgZW1wbGFjZV9iYWNrCiNkZWZpbmUgZmkgZmlyc3QKI2RlZmluZSBzZSBzZWNvbmQKI2RlZmluZSBzeihzKSAoaW50KXMuc2l6ZSgpCiNkZWZpbmUgYWxsKHMpIChzKS5iZWdpbigpLCAocykuZW5kKCkKI2RlZmluZSBtcyhhLHgpIG1lbXNldChhLCB4LCBzaXplb2YgKGEpKQojZGVmaW5lIGNuIGNvbnRpbnVlCiNkZWZpbmUgcmUgZXhpdCgwKQoKdHlwZWRlZiBsb25nIGxvbmcgbGw7CnR5cGVkZWYgdmVjdG9yPGludD4gdmk7Cgpjb25zdCBpbnQgbWF4biA9IDQwMDAwMCArIDE1Owpjb25zdCBsbCBJTkYgPSAobGwpNGUxODsKCmludCBuLCBtOwppbnQgc3RbbWF4bl0sIGVkW21heG5dLCB0aW1lcj0wOwppbnQgc3QyW21heG5dLCB0b3VyMlsyMF1bbWF4bioyXSwgdGltZXIyPTA7CmludCBoW21heG5dOwp2aSBnW21heG5dLCBuZ1ttYXhuXSwgY1ttYXhuXSwgY3VyOwpsbCBhbnNbbWF4bl0sIGRmZlttYXhuXTsKaW50IG5vZGVfYXRfdGluW21heG5dOwoKLy8gY29tcHV0ZSBzdWJ0cmVlIHNpemUgcXVpY2tseSBhcyBlZCAtIHN0ICsgMQoKdm9pZCBkZnMoaW50IHUsIGludCBwYXIpCnsKICAgIHN0W3VdPSsrdGltZXI7CiAgICBzdDJbdV09Kyt0aW1lcjI7IHRvdXIyWzBdW3RpbWVyMl09dTsKICAgIGZvcihhdXRvIHY6Z1t1XSkgaWYodiE9cGFyKQogICAgewogICAgICAgIGhbdl09aFt1XSsxOwogICAgICAgIGRmcyh2LCB1KTsKICAgICAgICB0b3VyMlswXVsrK3RpbWVyMl09dTsKICAgIH0KICAgIGVkW3VdPXRpbWVyOwp9Cgp2b2lkIHByZSgpCnsKICAgIGludCBMT0cgPSAxOTsKICAgIGZmKGosIDEsIExPRykgZmYoaSwgMSwgdGltZXIyLSgxPDxqKSsxKQogICAgewogICAgICAgIGludCB1PXRvdXIyW2otMV1baV0sIHY9dG91cjJbai0xXVtpKygxPDwoai0xKSldOwogICAgICAgIGlmKGhbdV08aFt2XSkgdG91cjJbal1baV09dTsKICAgICAgICBlbHNlIHRvdXIyW2pdW2ldPXY7CiAgICB9Cn0KCmlubGluZSBpbnQgbGNhKGludCB1LCBpbnQgdikKewogICAgaW50IGw9c3QyW3VdLCByPXN0Mlt2XTsKICAgIGlmIChsPnIpIHN3YXAobCwgcik7CiAgICBpbnQgaz0zMS1fX2J1aWx0aW5fY2x6KHItbCsxKTsKICAgIGludCBhID0gdG91cjJba11bbF0sIGIgPSB0b3VyMltrXVtyLSgxPDxrKSsxXTsKICAgIGlmKGhbYV0gPCBoW2JdKSByZXR1cm4gYTsKICAgIGVsc2UgcmV0dXJuIGI7Cn0KCmlubGluZSBib29sIGNtcF90aW4oaW50IHUsIGludCB2KQp7CiAgICByZXR1cm4gc3RbdV0gPCBzdFt2XTsKfQoKaW5saW5lIGJvb2wgY2hpbGRfb2YoaW50IHUsIGludCB2KQp7CiAgICByZXR1cm4gc3RbdV0gPD0gc3Rbdl0gJiYgZWRbdl0gPD0gZWRbdV07Cn0KCmlubGluZSB2b2lkIHVwZChpbnQgbCwgaW50IHIsIGxsIHZhbCkKewogICAgaWYgKGw+cikgcmV0dXJuOwogICAgZGZmW2xdICs9IHZhbDsKICAgIGRmZltyKzFdIC09IHZhbDsKfQoKdm9pZCBidWlsZF92aXJ0dWFsKCkKewogICAgc29ydChhbGwoY3VyKSwgY21wX3Rpbik7CiAgICBpbnQgayA9IHN6KGN1cik7CiAgICAvLyBhZGQgTENBcyBvZiBjb25zZWN1dGl2ZQogICAgZm9yIChpbnQgaSA9IDA7IGkrMSA8IGs7ICsraSkgY3VyLnBiKGxjYShjdXJbaV0sIGN1cltpKzFdKSk7CiAgICBzb3J0KGFsbChjdXIpLCBjbXBfdGluKTsKICAgIGN1ci5lcmFzZSh1bmlxdWUoYWxsKGN1cikpLCBjdXIuZW5kKCkpOwogICAgLy8gY2xlYXIgYWRqYWNlbmN5CiAgICBmb3IgKGludCB4IDogY3VyKSBuZ1t4XS5jbGVhcigpOwogICAgLy8gYnVpbGQgd2l0aCBzdGFjawogICAgdmVjdG9yPGludD4gc3RjazsKICAgIHN0Y2sucmVzZXJ2ZShzeihjdXIpKTsKICAgIHN0Y2sucHVzaF9iYWNrKGN1clswXSk7CiAgICBmb3IgKGludCBpID0gMTsgaSA8IHN6KGN1cik7ICsraSkKICAgIHsKICAgICAgICBpbnQgdiA9IGN1cltpXTsKICAgICAgICB3aGlsZSAoIWNoaWxkX29mKHN0Y2suYmFjaygpLCB2KSkgewogICAgICAgICAgICBpbnQgdSA9IHN0Y2suYmFjaygpOyBzdGNrLnBvcF9iYWNrKCk7CiAgICAgICAgICAgIG5nW3N0Y2suYmFjaygpXS5wYih1KTsKICAgICAgICB9CiAgICAgICAgc3Rjay5wdXNoX2JhY2sodik7CiAgICB9CiAgICB3aGlsZSAoc3ooc3RjaykgPiAxKSB7CiAgICAgICAgaW50IHUgPSBzdGNrLmJhY2soKTsgc3Rjay5wb3BfYmFjaygpOwogICAgICAgIG5nW3N0Y2suYmFjaygpXS5wYih1KTsKICAgIH0KfQoKaW50IGNudF9pbl9zdWJ0cmVlKGNvbnN0IHZpICZ2ZWMsIGludCB2KQp7CiAgICAvLyB2ZWMgc29ydGVkIGJ5IHRpbgogICAgYXV0byBsbyA9IGxvd2VyX2JvdW5kKHZlYy5iZWdpbigpLCB2ZWMuZW5kKCksIHN0W3ZdLCBbJl0oaW50IG5vZGUsIGludCB2YWx1ZSl7IHJldHVybiBzdFtub2RlXSA8IHZhbHVlOyB9KTsKICAgIGF1dG8gaGkgPSB1cHBlcl9ib3VuZCh2ZWMuYmVnaW4oKSwgdmVjLmVuZCgpLCBlZFt2XSwgWyZdKGludCB2YWx1ZSwgaW50IG5vZGUpeyByZXR1cm4gdmFsdWUgPCBzdFtub2RlXTsgfSk7CiAgICByZXR1cm4gaW50KGhpIC0gbG8pOwp9CgppbnQgbWFpbigpCnsKICAgIGlvczo6c3luY193aXRoX3N0ZGlvKGZhbHNlKTsKICAgIGNpbi50aWUobnVsbHB0cik7IGNvdXQudGllKG51bGxwdHIpOwogICAgaWYgKGZvcGVuKGZpbGUiLmlucCIsInIiKSkgewogICAgICAgIGZyZW9wZW4oZmlsZSIuaW5wIiwiciIsc3RkaW4pOwogICAgICAgIGZyZW9wZW4oZmlsZSIub3V0IiwidyIsc3Rkb3V0KTsKICAgIH0KICAgIGludCBzdWI7IGlmKCEoY2luPj5zdWIpKSByZXR1cm4gMDsKICAgIGNpbiA+PiBuID4+IG07CiAgICBmZihpLDEsbil7CiAgICAgICAgaW50IHg7IGNpbiA+PiB4OyBjW3hdLnBiKGkpOwogICAgfQogICAgZmYoaSwxLG4tMSl7CiAgICAgICAgaW50IHUsdix3OyBjaW4gPj4gdSA+PiB2ID4+IHc7CiAgICAgICAgZ1t1XS5wYih2KTsgZ1t2XS5wYih1KTsKICAgIH0KCiAgICAvLyBwcmVwcm9jZXNzCiAgICB0aW1lciA9IDA7IHRpbWVyMiA9IDA7CiAgICBoWzFdID0gMDsKICAgIGRmcygxLCAwKTsKICAgIHByZSgpOwogICAgLy8gYnVpbGQgaW52ZXJzZSB0aW4KICAgIGZmKGksMSxuKSBub2RlX2F0X3RpbltzdFtpXV0gPSBpOwoKICAgIC8vIG1hcmsgYXJyYXkgZm9yIGNvbG9yZWQgbm9kZXMgcGVyIGNvbG9yCiAgICBzdGF0aWMgaW50IGlzX2NvbFttYXhuXTsKICAgIG1zKGlzX2NvbCwgMCk7CiAgICBtcyhkZmYsIDApOwogICAgLy8gcHJvY2VzcyBlYWNoIGNvbG9yCiAgICBmb3IgKGludCBjb2wgPSAxOyBjb2wgPD0gbjsgKytjb2wpCiAgICB7CiAgICAgICAgaWYgKGNbY29sXS5lbXB0eSgpKSBjb250aW51ZTsKICAgICAgICAvLyB2ZWM6IG9yaWdpbmFsIGNvbG9yZWQgbm9kZXMgc29ydGVkIGJ5IHRpbgogICAgICAgIHZpIHZlYyA9IGNbY29sXTsKICAgICAgICBzb3J0KGFsbCh2ZWMpLCBjbXBfdGluKTsKICAgICAgICAvLyBwcmVwYXJlIGN1ciA9IHZlYyAod2lsbCBiZSBhcHBlbmRlZCBMQ0FzIGluc2lkZSBidWlsZF92aXJ0dWFsKQogICAgICAgIGN1ci5jbGVhcigpOwogICAgICAgIGZvciAoaW50IHggOiB2ZWMpIGN1ci5wYih4KTsKICAgICAgICAvLyBtYXJrIGNvbG9yZWQgbm9kZXMKICAgICAgICBmb3IgKGludCB4IDogdmVjKSBpc19jb2xbeF0gPSAxOwogICAgICAgIC8vIGJ1aWxkIHZpcnR1YWwgdHJlZSAobmcgYWRqYWNlbmN5IGZpbGxlZCwgY3VyIHVwZGF0ZWQpCiAgICAgICAgYnVpbGRfdmlydHVhbCgpOwogICAgICAgIC8vIGl0ZXJhdGUgdmlydHVhbCBub2RlcyBpbiBjdXIgYW5kIGNvbXB1dGUgY29udHJpYnV0aW9ucwogICAgICAgIGZvciAoaW50IHYgOiBjdXIpCiAgICAgICAgewogICAgICAgICAgICAvLyBzdW0gc2l6ZXMgb2YgdmlydHVhbCBjaGlsZHJlbgogICAgICAgICAgICBsbCBzdW1fY2ggPSAwOwogICAgICAgICAgICBmb3IgKGludCBjaCA6IG5nW3ZdKSB7CiAgICAgICAgICAgICAgICBpbnQgc3ViY2ggPSBlZFtjaF0gLSBzdFtjaF0gKyAxOwogICAgICAgICAgICAgICAgc3VtX2NoICs9IHN1YmNoOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJvb2wgdl9pc19jb2wgPSBpc19jb2xbdl07CiAgICAgICAgICAgIGludCBzdWJfdiA9IGVkW3ZdIC0gc3Rbdl0gKyAxOwogICAgICAgICAgICBpZiAoIXZfaXNfY29sKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBvbmUgYmxvY2s6IHN1YnRyZWVbdl0gbWludXMgY2hpbGRyZW4ncyBzdWJ0cmVlcwogICAgICAgICAgICAgICAgbGwgYmxvY2tfc3ogPSAobGwpc3ViX3YgLSBzdW1fY2g7CiAgICAgICAgICAgICAgICBpZiAoYmxvY2tfc3ogPiAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGxsIHZhbCA9IChsbCluIC0gYmxvY2tfc3o7CiAgICAgICAgICAgICAgICAgICAgLy8gYWRkIHZhbCB0byBzdWJ0cmVlW3ZdCiAgICAgICAgICAgICAgICAgICAgdXBkKHN0W3ZdLCBlZFt2XSwgdmFsKTsKICAgICAgICAgICAgICAgICAgICAvLyBzdWJ0cmFjdCB2YWwgZnJvbSBlYWNoIGNoaWxkIHN1YnRyZWUKICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBjaCA6IG5nW3ZdKSB1cGQoc3RbY2hdLCBlZFtjaF0sIC12YWwpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gdiBpcyBjb2xvcmVkOiBlYWNoIG5laWdoYm9yLXNpZGUgdGhhdCBjb250YWlucyAwIGNvbG9yZWQgbm9kZXMgaXMgYSBibG9jawogICAgICAgICAgICAgICAgLy8gaXRlcmF0ZSBvcmlnaW5hbCBuZWlnaGJvcnMKICAgICAgICAgICAgICAgIGZvciAoaW50IHRvIDogZ1t2XSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGRfb2YodG8sIHYpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvIGlzIGFuY2VzdG9yIG9mIHYgLT4gcGFyZW50IHNpZGU7IHNob3VsZG4ndCBoYXBwZW4gYmVjYXVzZSBjaGlsZF9vZih0byx2KSBtZWFucyB0byBpcyBhbmNlc3RvciBvZiB2CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJ1dCBpbiB0cmVlIGFkamFjZW5jeSwgZWl0aGVyIHRvIGlzIGNoaWxkIG9mIHYgb3IgcGFyZW50IG9mIHYKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkX29mKHYsIHRvKSkgewogICAgICAgICAgICAgICAgICAgICAgICAvLyAndG8nIGlzIGNoaWxkIG9mIHYgaW4gb3JpZ2luYWwgcm9vdGVkIHRyZWUKICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNudGNvbCA9IGNudF9pbl9zdWJ0cmVlKHZlYywgdG8pOwogICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2lkZV9zeiA9IGVkW3RvXSAtIHN0W3RvXSArIDE7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbnRjb2wgPT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGwgdmFsID0gKGxsKW4gLSBzaWRlX3N6OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkKHN0W3RvXSwgZWRbdG9dLCB2YWwpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gJ3RvJyBpcyBwYXJlbnQgc2lkZSAob3V0c2lkZSBzdWJ0cmVlIHYpCiAgICAgICAgICAgICAgICAgICAgICAgIGludCB0b3RhbF9jb2wgPSBzeih2ZWMpOwogICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5zaWRlX3YgPSBjbnRfaW5fc3VidHJlZSh2ZWMsIHYpOwogICAgICAgICAgICAgICAgICAgICAgICBpbnQgb3V0c2lkZV9jb2wgPSB0b3RhbF9jb2wgLSBpbnNpZGVfdjsKICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpZGVfc3ogPSBuIC0gc3ViX3Y7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvdXRzaWRlX2NvbCA9PSAwICYmIHNpZGVfc3ogPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbCB2YWwgPSAobGwpbiAtIHNpZGVfc3o7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvdXRzaWRlIHN1YnRyZWU6IHR3byBpbnRlcnZhbHMgWzEsIHN0W3ZdLTFdIGFuZCBbZWRbdl0rMSwgbl0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdFt2XSA+IDEpIHVwZCgxLCBzdFt2XS0xLCB2YWwpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVkW3ZdIDwgbikgdXBkKGVkW3ZdKzEsIG4sIHZhbCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvLyBjb2xvcmVkIG5vZGUgaXRzZWxmOiBldmVyeSBwYXRoIHRvIGFueSBub2RlIGNvbnRhaW5zIGl0cyBvd24gY29sb3IKICAgICAgICAgICAgICAgIHVwZChzdFt2XSwgc3Rbdl0sIChsbCluKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvLyBjbGVhbnVwIG1hcmtzCiAgICAgICAgZm9yIChpbnQgeCA6IHZlYykgaXNfY29sW3hdID0gMDsKICAgIH0KCiAgICAvLyBhY2N1bXVsYXRlIGRpZmYgdG8gYW5zCiAgICBsbCBjdXJ2ID0gMDsKICAgIGZmKHQsMSxuKQogICAgewogICAgICAgIGN1cnYgKz0gZGZmW3RdOwogICAgICAgIGFuc1tub2RlX2F0X3Rpblt0XV0gPSBjdXJ2OwogICAgfQoKICAgIC8vIHByaW50IGFuc3dlcnMKICAgIGZmKGksMSxuKQogICAgewogICAgICAgIGlmIChpPjEpIGNvdXQgPDwgJyAnOwogICAgICAgIGNvdXQgPDwgYW5zW2ldOwogICAgfQogICAgY291dCA8PCAnXG4nOwogICAgcmV0dXJuIDA7Cn0K