// Author: Muhammed Khaled Shoeib
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace __gnu_pbds;
using namespace std;
//....................................................
// struct to speed-up the unordered data structures like map/set.
struct hash_function // unordered + modified hash >> ordered
{ static uint64_t splitmix64(uint64_t x) {
x += 0x9e3779b97f4a7c15; x = (x ^ (x >> 30)) * 0xbf58476d1ce4e5b9;
x = (x ^ (x >> 27)) * 0x94d049bb133111eb; return x ^ (x >> 31); }
size_t operator()(uint64_t x) const {
static const uint64_t FIXED_RANDOM = chrono::steady_clock::now().time_since_epoch().count();
return splitmix64(x + FIXED_RANDOM); } };
//....................................................
template < typename T, typename Compare = less < T > > // O(logn)
using ordered_set = tree < T, null_type, Compare, rb_tree_tag, tree_order_statistics_node_update>;
// less_equal: asc. not_unique, st.order_of_key(k) --> no. of items < k, less: unique
// greater_equal: desc. not_unique, st.order_of_key(k) --> no. of items > k, greater: unique
// *st.find_by_order(k) --> st[k] (Zero-indexed)
// less_equal (u can't erase here!) == multi-set
template < typename T > using maxpq = priority_queue < T >;
template < typename T > using minpq = priority_queue < T, vector< T >, greater< T > >;
//....................................................
#define boost ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0)
#define precision(a) cout << fixed << setprecision(a)
#define alo cout << "alooooooooooo!" << endl
#define YES cout << "YES" << endl
#define Yes cout << "Yes" << endl
#define yes cout << "yes" << endl
#define NO cout << "NO" << endl
#define No cout << "No" << endl
#define no cout << "no" << endl
#define ne cout << -1 << endl
#define endl "\n"
#define mem(mat, val) memset(mat, val, sizeof(mat))
#define ones(x) __builtin_popcountll(x)
#define msb(x) 63ll - __builtin_clzll(x)
#define lsb(x) __builtin_ffsll(x) - 1ll
//....................................................
#define all(x) x.begin(), x.end()
#define rall(x) x.rbegin(),x.rend()
#define _ceil(a, b) (((ll)(a) + (ll)(b - 1)) / (ll)(b)) // up
#define _floor(a, b) (a / b) // down
#define _round(a, b) ((a + (b / 2ll)) / b) // nearest
//....................................................
// using ll = int; // take care of this shit!
using ll = long long;
using i64 = long long; using i32 = int; using lli = long long int; using LL = __int128;
using ld = long double; using LD = __float128; using ull = unsigned long long;
using cld = complex < long double >; using cd = complex < double >;
//......................................................
ll _gcd(ll x, ll y) { return y ? _gcd(y, x % y) : x; } // O(log(min(x, y)))
ll _lcm(ll a, ll b) { ll g = _gcd(a, b); return (a * b) / g; }
//mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
//#define getrand(l, r) uniform_int_distribution<long long>(l, r)(rng)
//......................................................
int dx[4] = {-1, 0, 1, 0}, dy[4] = {0, 1, 0, -1};
int dx_diag[4] = { 1, 1, -1, -1 }, dy_diag[4] = { 1, -1, -1, 1 };
int dx_all[8] = {-1, -1, -1, 0, 1, 1, 1, 0}, dy_all[8] = {-1, 0, 1, 1, 1, 0, -1, -1};
int dx_knight[8] = {2, 2, 1, 1, -2, -2, -1, -1}, dy_knight[8] = {1, -1, 2, -2, 1, -1, 2, -2};
const ld pi = acos(-1); // 3.141592653589793238462643383279
const ld eps = 1e-9;
// const ll inf = (ll)INT32_MAX; // 2e9
const ll oo = (ll)1e18; // 1e15 (may cause OF in DP, Binary Search, ...)
const ll OO = (ll)INT64_MAX; // 9e18
const ll mod = (ll)1e9 + 7; // 1e9 + 7, 998244353
//..................................................... // string(len, char);
/*
* think twice, code once.
* think of different approaches to tackle a problem, write them down.
* think of different views of the problem, don't look from only one side.
* don't get stuck in one approach/problem.
* common mistakes: line 49, overflow (sum of many numbers), corner cases (n = 1), over/under count, infinite loops,
* TLE, MLE (int instead of ll, using memset, Recursive DP, ...), RTE (out of bounds indexing), ....
*/
///____________________________________________ Shoeib __________________________________________________________
// log(n) for insert & eval, O(1) for rollback.
// All lines should be added in strictly increasing slope order.
class PersistentCHT
{
struct Line
{
ll m, c;
Line() { }
Line(ll _m, ll _c) : m(_m), c(_c) { }
};
vector < vector < Line > > hull;
vector < ll > version_idx;
vector < ll > version_sz;
ll SZ = 0;
ld inter(Line t1, Line t2)
{
ld ret;
ret = (ld)(t2.c - t1.c - .0)/(t1.m - t2.m - .0);
return ret;
}
void insert_line(Line curr)
{
Line temp, temp2;
version_sz.push_back(SZ);
if(SZ > 1)
{
ll s = 0, e = SZ - 1;
while(s < e)
{
ll p = (s + e) / 2;
temp = hull[p + 1].back();
temp2 = hull[p].back();
ld point = inter(temp, temp2);
ld point2 = inter(temp, curr);
if(point < point2) s = p+1;
else e = p;
}
SZ = s + 1;
}
if(hull.size() == SZ)
{
vector<Line> x;
hull.push_back(x);
}
hull[SZ].push_back(curr);
version_idx.push_back(SZ);
SZ++;
}
public:
void insert_line(ll m, ll c){ insert_line(Line(m, c)); }
ll eval(ll find)
{
ll s = 0, e = SZ - 1;
while(s < e)
{
ll p = (s + e) / 2;
ld point = inter(hull[p].back(), hull[p + 1].back());
if(point < find) s = p + 1;
else e = p;
}
ll ret = (hull[s].back().m * find) + hull[s].back().c;
return ret;
}
void rollback()
{
SZ = version_sz.back();
version_sz.pop_back();
hull[version_idx.back()].pop_back();
version_idx.pop_back();
}
ll size() { return SZ; }
};
// ...........
ll n;
vector < vector < pair < ll, ll > > > graph;
vector < ll > s, v, dp;
// dp[u] = min(s[u] + (dist[u] - dist[v])*v[u] + dp[v]) --> from u to it's ancestor v.
// dp[u] = min(s[u] + dist[u]*v[u] - dist[v]*v[u] + dp[v])
// dp[u] = min(s[u] + dist[u]*v[u] + m * x + c )
PersistentCHT pcht;
void dfs(ll root, ll par, ll dist)
{
if(root != 1) dp[root] = s[root] + dist*v[root] + -1*pcht.eval(v[root]);
pcht.insert_line(dist, -dp[root]);
for(const auto &i : graph[root])
{
if(i.first == par) continue;
dfs(i.first, root, dist + i.second);
}
pcht.rollback();
}
void solve()
{
cin >> n;
graph.resize(n + 1);
for(ll i = 1; i <= n - 1; i++)
{
ll u, v, d; cin >> u >> v >> d;
graph[u].push_back({v, d});
graph[v].push_back({u, d});
}
s.resize(n + 1); v.resize(n + 1);
for(ll i = 2; i <= n; i++) cin >> s[i] >> v[i];
dp.resize(n + 1);
dfs(1, 0, 0);
for(ll i = 2; i <= n; i++) cout << dp[i] << ' ';
cout << endl;
return;
}
signed main()
{
boost;
// freopen("bank.in", "r", stdin);
// freopen("bank.out", "w", stdout);
// precision(15);
i32 _ = 1; //cin >> _;
// cout.flush();
while(_--) solve();
return 0;
}
Ly8gQXV0aG9yOiBNdWhhbW1lZCBLaGFsZWQgU2hvZWliCgojaW5jbHVkZSA8Yml0cy9zdGRjKysuaD4KI2luY2x1ZGUgPGV4dC9wYl9kcy9hc3NvY19jb250YWluZXIuaHBwPgojaW5jbHVkZSA8ZXh0L3BiX2RzL3RyZWVfcG9saWN5LmhwcD4KdXNpbmcgbmFtZXNwYWNlIF9fZ251X3BiZHM7CnVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci8vLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgovLyBzdHJ1Y3QgdG8gc3BlZWQtdXAgdGhlIHVub3JkZXJlZCBkYXRhIHN0cnVjdHVyZXMgbGlrZSBtYXAvc2V0LgpzdHJ1Y3QgaGFzaF9mdW5jdGlvbiAvLyB1bm9yZGVyZWQgKyBtb2RpZmllZCBoYXNoID4+IG9yZGVyZWQKeyAgIHN0YXRpYyB1aW50NjRfdCBzcGxpdG1peDY0KHVpbnQ2NF90IHgpIHsKICAgICAgICB4ICs9IDB4OWUzNzc5Yjk3ZjRhN2MxNTsgeCA9ICh4IF4gKHggPj4gMzApKSAqIDB4YmY1ODQ3NmQxY2U0ZTViOTsKICAgICAgICB4ID0gKHggXiAoeCA+PiAyNykpICogMHg5NGQwNDliYjEzMzExMWViOyByZXR1cm4geCBeICh4ID4+IDMxKTsgfQogICAgc2l6ZV90IG9wZXJhdG9yKCkodWludDY0X3QgeCkgY29uc3QgewogICAgICAgIHN0YXRpYyBjb25zdCB1aW50NjRfdCBGSVhFRF9SQU5ET00gPSBjaHJvbm86OnN0ZWFkeV9jbG9jazo6bm93KCkudGltZV9zaW5jZV9lcG9jaCgpLmNvdW50KCk7CiAgICAgICAgcmV0dXJuIHNwbGl0bWl4NjQoeCArIEZJWEVEX1JBTkRPTSk7IH0gfTsKLy8uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCnRlbXBsYXRlIDwgdHlwZW5hbWUgVCwgdHlwZW5hbWUgQ29tcGFyZSA9IGxlc3MgPCBUID4gPiAvLyBPKGxvZ24pCnVzaW5nIG9yZGVyZWRfc2V0ID0gdHJlZSA8IFQsIG51bGxfdHlwZSwgQ29tcGFyZSwgcmJfdHJlZV90YWcsIHRyZWVfb3JkZXJfc3RhdGlzdGljc19ub2RlX3VwZGF0ZT47Ci8vIGxlc3NfZXF1YWw6ICAgIGFzYy4gIG5vdF91bmlxdWUsIHN0Lm9yZGVyX29mX2tleShrKSAtLT4gbm8uIG9mIGl0ZW1zIDwgaywgIGxlc3M6IHVuaXF1ZQovLyBncmVhdGVyX2VxdWFsOiBkZXNjLiBub3RfdW5pcXVlLCBzdC5vcmRlcl9vZl9rZXkoaykgLS0+IG5vLiBvZiBpdGVtcyA+IGssICBncmVhdGVyOiB1bmlxdWUKLy8gKnN0LmZpbmRfYnlfb3JkZXIoaykgLS0+IHN0W2tdIChaZXJvLWluZGV4ZWQpCi8vIGxlc3NfZXF1YWwgKHUgY2FuJ3QgZXJhc2UgaGVyZSEpID09IG11bHRpLXNldAp0ZW1wbGF0ZSA8IHR5cGVuYW1lIFQgPiB1c2luZyBtYXhwcSA9IHByaW9yaXR5X3F1ZXVlIDwgVCA+Owp0ZW1wbGF0ZSA8IHR5cGVuYW1lIFQgPiB1c2luZyBtaW5wcSA9IHByaW9yaXR5X3F1ZXVlIDwgVCwgdmVjdG9yPCBUID4sIGdyZWF0ZXI8IFQgPiA+OwovLy4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KI2RlZmluZSAgICAgYm9vc3QgICAgICAgICAgICAgICAgICBpb3NfYmFzZTo6c3luY193aXRoX3N0ZGlvKGZhbHNlKTsgY2luLnRpZSgwKTsgY291dC50aWUoMCkKI2RlZmluZSAgICAgcHJlY2lzaW9uKGEpICAgICAgICAgICBjb3V0IDw8IGZpeGVkIDw8IHNldHByZWNpc2lvbihhKQojZGVmaW5lICAgICBhbG8gICAgICAgICAgICAgICAgICAgIGNvdXQgPDwgImFsb29vb29vb29vb28hIiA8PCBlbmRsCiNkZWZpbmUgICAgIFlFUyAgICAgICAgICAgICAgICAgICAgY291dCA8PCAiWUVTIiA8PCBlbmRsCiNkZWZpbmUgICAgIFllcyAgICAgICAgICAgICAgICAgICAgY291dCA8PCAiWWVzIiA8PCBlbmRsCiNkZWZpbmUgICAgIHllcyAgICAgICAgICAgICAgICAgICAgY291dCA8PCAieWVzIiA8PCBlbmRsCiNkZWZpbmUgICAgIE5PICAgICAgICAgICAgICAgICAgICAgY291dCA8PCAiTk8iIDw8IGVuZGwKI2RlZmluZSAgICAgTm8gICAgICAgICAgICAgICAgICAgICBjb3V0IDw8ICJObyIgPDwgZW5kbAojZGVmaW5lICAgICBubyAgICAgICAgICAgICAgICAgICAgIGNvdXQgPDwgIm5vIiA8PCBlbmRsCiNkZWZpbmUgICAgIG5lICAgICAgICAgICAgICAgICAgICAgY291dCA8PCAtMSA8PCBlbmRsCiNkZWZpbmUgICAgIGVuZGwgICAgICAgICAgICAgICAgICAgIlxuIgojZGVmaW5lICAgICBtZW0obWF0LCB2YWwpICAgICAgICAgIG1lbXNldChtYXQsIHZhbCwgc2l6ZW9mKG1hdCkpCiNkZWZpbmUgICAgIG9uZXMoeCkgICAgICAgICAgICAgICBfX2J1aWx0aW5fcG9wY291bnRsbCh4KQojZGVmaW5lICAgICBtc2IoeCkgICAgICAgICAgICAgICAgNjNsbCAtIF9fYnVpbHRpbl9jbHpsbCh4KQojZGVmaW5lICAgICBsc2IoeCkgICAgICAgICAgICAgICAgX19idWlsdGluX2Zmc2xsKHgpIC0gMWxsCi8vLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgojZGVmaW5lICAgICBhbGwoeCkgICAgICAgICAgICAgICAgIHguYmVnaW4oKSwgeC5lbmQoKQojZGVmaW5lICAgICByYWxsKHgpICAgICAgICAgICAgICAgIHgucmJlZ2luKCkseC5yZW5kKCkKI2RlZmluZSAgICAgX2NlaWwoYSwgYikgICAgICAgICAgICAoKChsbCkoYSkgKyAobGwpKGIgLSAxKSkgLyAobGwpKGIpKSAvLyB1cAojZGVmaW5lICAgICBfZmxvb3IoYSwgYikgICAgICAgICAgIChhIC8gYikgLy8gZG93bgojZGVmaW5lICAgICBfcm91bmQoYSwgYikgICAgICAgICAgICgoYSArIChiIC8gMmxsKSkgLyBiKSAvLyBuZWFyZXN0Ci8vLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgovLyB1c2luZyBsbCAgPSBpbnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGFrZSBjYXJlIG9mIHRoaXMgc2hpdCEKdXNpbmcgbGwgID0gbG9uZyBsb25nOwp1c2luZyBpNjQgPSBsb25nIGxvbmc7IHVzaW5nIGkzMiA9IGludDsgdXNpbmcgbGxpID0gbG9uZyBsb25nIGludDsgdXNpbmcgTEwgPSBfX2ludDEyODsKdXNpbmcgbGQgID0gbG9uZyBkb3VibGU7IHVzaW5nIExEID0gX19mbG9hdDEyODsgdXNpbmcgdWxsID0gdW5zaWduZWQgbG9uZyBsb25nOwp1c2luZyBjbGQgPSBjb21wbGV4IDwgbG9uZyBkb3VibGUgPjsgdXNpbmcgY2QgPSBjb21wbGV4IDwgZG91YmxlID47Ci8vLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCmxsIF9nY2QobGwgeCwgbGwgeSkgeyByZXR1cm4geSA/IF9nY2QoeSwgeCAlIHkpIDogeDsgfSAvLyBPKGxvZyhtaW4oeCwgeSkpKQpsbCBfbGNtKGxsIGEsIGxsIGIpIHsgbGwgZyA9IF9nY2QoYSwgYik7IHJldHVybiAoYSAqIGIpIC8gZzsgfQovL210MTk5Mzcgcm5nKGNocm9ubzo6c3RlYWR5X2Nsb2NrOjpub3coKS50aW1lX3NpbmNlX2Vwb2NoKCkuY291bnQoKSk7Ci8vI2RlZmluZSBnZXRyYW5kKGwsIHIpIHVuaWZvcm1faW50X2Rpc3RyaWJ1dGlvbjxsb25nIGxvbmc+KGwsIHIpKHJuZykKLy8uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KaW50IGR4WzRdID0gey0xLCAwLCAxLCAwfSwgZHlbNF0gPSB7MCwgMSwgMCwgLTF9OwppbnQgZHhfZGlhZ1s0XSA9IHsgMSwgMSwgLTEsIC0xIH0sIGR5X2RpYWdbNF0gPSB7IDEsIC0xLCAtMSwgMSB9OwppbnQgZHhfYWxsWzhdID0gey0xLCAtMSwgLTEsIDAsIDEsIDEsIDEsIDB9LCBkeV9hbGxbOF0gPSB7LTEsIDAsIDEsIDEsIDEsIDAsIC0xLCAtMX07CmludCBkeF9rbmlnaHRbOF0gPSB7MiwgMiwgMSwgMSwgLTIsIC0yLCAtMSwgLTF9LCBkeV9rbmlnaHRbOF0gPSB7MSwgLTEsIDIsIC0yLCAxLCAtMSwgMiwgLTJ9Owpjb25zdCBsZCAgcGkgID0gYWNvcygtMSk7IC8vIDMuMTQxNTkyNjUzNTg5NzkzMjM4NDYyNjQzMzgzMjc5CmNvbnN0IGxkIGVwcyA9IDFlLTk7Ci8vIGNvbnN0IGxsIGluZiA9IChsbClJTlQzMl9NQVg7IC8vIDJlOQpjb25zdCBsbCBvbyA9IChsbCkxZTE4OyAgICAgICAvLyAxZTE1IChtYXkgY2F1c2UgT0YgaW4gRFAsIEJpbmFyeSBTZWFyY2gsIC4uLikKY29uc3QgbGwgT08gPSAobGwpSU5UNjRfTUFYOyAgLy8gOWUxOApjb25zdCBsbCBtb2QgID0gKGxsKTFlOSArIDc7ICAvLyAxZTkgKyA3LCA5OTgyNDQzNTMKLy8uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAvLyBzdHJpbmcobGVuLCBjaGFyKTsKLyoKICogdGhpbmsgdHdpY2UsIGNvZGUgb25jZS4KICogdGhpbmsgb2YgZGlmZmVyZW50IGFwcHJvYWNoZXMgdG8gdGFja2xlIGEgcHJvYmxlbSwgd3JpdGUgdGhlbSBkb3duLgogKiB0aGluayBvZiBkaWZmZXJlbnQgdmlld3Mgb2YgdGhlIHByb2JsZW0sIGRvbid0IGxvb2sgZnJvbSBvbmx5IG9uZSBzaWRlLgogKiBkb24ndCBnZXQgc3R1Y2sgaW4gb25lIGFwcHJvYWNoL3Byb2JsZW0uCiAqIGNvbW1vbiBtaXN0YWtlczogbGluZSA0OSwgb3ZlcmZsb3cgKHN1bSBvZiBtYW55IG51bWJlcnMpLCBjb3JuZXIgY2FzZXMgKG4gPSAxKSwgb3Zlci91bmRlciBjb3VudCwgaW5maW5pdGUgbG9vcHMsCiAqIFRMRSwgTUxFIChpbnQgaW5zdGVhZCBvZiBsbCwgdXNpbmcgbWVtc2V0LCBSZWN1cnNpdmUgRFAsIC4uLiksIFJURSAob3V0IG9mIGJvdW5kcyBpbmRleGluZyksIC4uLi4KICovCi8vL19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIFNob2VpYiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgoKLy8gbG9nKG4pIGZvciBpbnNlcnQgJiBldmFsLCAgTygxKSBmb3Igcm9sbGJhY2suCi8vIEFsbCBsaW5lcyBzaG91bGQgYmUgYWRkZWQgaW4gc3RyaWN0bHkgaW5jcmVhc2luZyBzbG9wZSBvcmRlci4KCmNsYXNzIFBlcnNpc3RlbnRDSFQKewogICAgc3RydWN0IExpbmUKICAgIHsKICAgICAgICBsbCBtLCBjOwogICAgICAgIExpbmUoKSB7IH0KICAgICAgICBMaW5lKGxsIF9tLCBsbCBfYykgOiBtKF9tKSwgYyhfYykgeyB9CiAgICB9OwoKICAgIHZlY3RvciA8IHZlY3RvciA8IExpbmUgPiA+IGh1bGw7CiAgICB2ZWN0b3IgPCBsbCA+IHZlcnNpb25faWR4OwogICAgdmVjdG9yIDwgbGwgPiB2ZXJzaW9uX3N6OwogICAgbGwgU1ogPSAwOwoKICAgIGxkIGludGVyKExpbmUgdDEsIExpbmUgdDIpCiAgICB7CiAgICAgICAgbGQgcmV0OwogICAgICAgIHJldCA9IChsZCkodDIuYyAtIHQxLmMgLSAuMCkvKHQxLm0gLSB0Mi5tIC0gLjApOwogICAgICAgIHJldHVybiByZXQ7CiAgICB9CgogICAgdm9pZCBpbnNlcnRfbGluZShMaW5lIGN1cnIpCiAgICB7CiAgICAgICAgTGluZSB0ZW1wLCB0ZW1wMjsKICAgICAgICB2ZXJzaW9uX3N6LnB1c2hfYmFjayhTWik7CgogICAgICAgIGlmKFNaID4gMSkKICAgICAgICB7CiAgICAgICAgICAgIGxsIHMgPSAwLCBlID0gU1ogLSAxOwoKICAgICAgICAgICAgd2hpbGUocyA8IGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGxsIHAgPSAocyArIGUpIC8gMjsKCiAgICAgICAgICAgICAgICB0ZW1wID0gaHVsbFtwICsgMV0uYmFjaygpOwogICAgICAgICAgICAgICAgdGVtcDIgPSBodWxsW3BdLmJhY2soKTsKCiAgICAgICAgICAgICAgICBsZCBwb2ludCA9IGludGVyKHRlbXAsIHRlbXAyKTsKICAgICAgICAgICAgICAgIGxkIHBvaW50MiA9IGludGVyKHRlbXAsIGN1cnIpOwoKICAgICAgICAgICAgICAgIGlmKHBvaW50IDwgcG9pbnQyKSBzID0gcCsxOwogICAgICAgICAgICAgICAgZWxzZSBlID0gcDsKICAgICAgICAgICAgfQogICAgICAgICAgICBTWiA9IHMgKyAxOwogICAgICAgIH0KCiAgICAgICAgaWYoaHVsbC5zaXplKCkgPT0gU1opCiAgICAgICAgewogICAgICAgICAgICB2ZWN0b3I8TGluZT4geDsKICAgICAgICAgICAgaHVsbC5wdXNoX2JhY2soeCk7CiAgICAgICAgfQoKICAgICAgICBodWxsW1NaXS5wdXNoX2JhY2soY3Vycik7CiAgICAgICAgdmVyc2lvbl9pZHgucHVzaF9iYWNrKFNaKTsKICAgICAgICBTWisrOwogICAgfQoKcHVibGljOgoKICAgIHZvaWQgaW5zZXJ0X2xpbmUobGwgbSwgbGwgYyl7IGluc2VydF9saW5lKExpbmUobSwgYykpOyB9CgogICAgbGwgZXZhbChsbCBmaW5kKQogICAgewogICAgICAgIGxsIHMgPSAwLCBlID0gU1ogLSAxOwoKICAgICAgICB3aGlsZShzIDwgZSkKICAgICAgICB7CiAgICAgICAgICAgIGxsIHAgPSAocyArIGUpIC8gMjsKICAgICAgICAgICAgbGQgcG9pbnQgPSBpbnRlcihodWxsW3BdLmJhY2soKSwgaHVsbFtwICsgMV0uYmFjaygpKTsKICAgICAgICAgICAgaWYocG9pbnQgPCBmaW5kKSBzID0gcCArIDE7CiAgICAgICAgICAgIGVsc2UgZSA9IHA7CiAgICAgICAgfQoKICAgICAgICBsbCByZXQgPSAoaHVsbFtzXS5iYWNrKCkubSAqIGZpbmQpICsgaHVsbFtzXS5iYWNrKCkuYzsKICAgICAgICByZXR1cm4gcmV0OwogICAgfQoKICAgIHZvaWQgcm9sbGJhY2soKQogICAgewogICAgICAgIFNaID0gdmVyc2lvbl9zei5iYWNrKCk7CiAgICAgICAgdmVyc2lvbl9zei5wb3BfYmFjaygpOwogICAgICAgIGh1bGxbdmVyc2lvbl9pZHguYmFjaygpXS5wb3BfYmFjaygpOwogICAgICAgIHZlcnNpb25faWR4LnBvcF9iYWNrKCk7CiAgICB9CgogICAgbGwgIHNpemUoKSB7IHJldHVybiBTWjsgfQoKfTsKCgovLyAuLi4uLi4uLi4uLgoKCmxsIG47CnZlY3RvciA8IHZlY3RvciA8IHBhaXIgPCBsbCwgbGwgPiA+ID4gZ3JhcGg7CnZlY3RvciA8IGxsID4gcywgdiwgZHA7CgoKLy8gZHBbdV0gPSBtaW4oc1t1XSArIChkaXN0W3VdIC0gZGlzdFt2XSkqdlt1XSArICBkcFt2XSkgLS0+IGZyb20gdSB0byBpdCdzIGFuY2VzdG9yIHYuCi8vIGRwW3VdID0gbWluKHNbdV0gKyBkaXN0W3VdKnZbdV0gLSBkaXN0W3ZdKnZbdV0gKyBkcFt2XSkKLy8gZHBbdV0gPSBtaW4oc1t1XSArIGRpc3RbdV0qdlt1XSAgKyAgIG0gICAqIHggICsgICAgYyAgKQoKClBlcnNpc3RlbnRDSFQgcGNodDsKCnZvaWQgZGZzKGxsIHJvb3QsIGxsIHBhciwgbGwgZGlzdCkKewogICAgaWYocm9vdCAhPSAxKSBkcFtyb290XSA9IHNbcm9vdF0gKyBkaXN0KnZbcm9vdF0gKyAtMSpwY2h0LmV2YWwodltyb290XSk7CgogICAgcGNodC5pbnNlcnRfbGluZShkaXN0LCAtZHBbcm9vdF0pOwoKICAgIGZvcihjb25zdCBhdXRvICZpIDogZ3JhcGhbcm9vdF0pCiAgICB7CiAgICAgICAgaWYoaS5maXJzdCA9PSBwYXIpIGNvbnRpbnVlOwogICAgICAgIGRmcyhpLmZpcnN0LCByb290LCBkaXN0ICsgaS5zZWNvbmQpOwogICAgfQoKICAgIHBjaHQucm9sbGJhY2soKTsKCn0KCgoKdm9pZCBzb2x2ZSgpCnsKCiAgICBjaW4gPj4gbjsKICAgIGdyYXBoLnJlc2l6ZShuICsgMSk7CiAgICBmb3IobGwgaSA9IDE7IGkgPD0gbiAtIDE7IGkrKykKICAgIHsKICAgICAgICBsbCB1LCB2LCBkOyBjaW4gPj4gdSA+PiB2ID4+IGQ7CiAgICAgICAgZ3JhcGhbdV0ucHVzaF9iYWNrKHt2LCBkfSk7CiAgICAgICAgZ3JhcGhbdl0ucHVzaF9iYWNrKHt1LCBkfSk7CiAgICB9CgogICAgcy5yZXNpemUobiArIDEpOyB2LnJlc2l6ZShuICsgMSk7CiAgICBmb3IobGwgaSA9IDI7IGkgPD0gbjsgaSsrKSBjaW4gPj4gc1tpXSA+PiB2W2ldOwoKCiAgICBkcC5yZXNpemUobiArIDEpOwoKCiAgICBkZnMoMSwgMCwgMCk7CgogICAgZm9yKGxsIGkgPSAyOyBpIDw9IG47IGkrKykgY291dCA8PCBkcFtpXSA8PCAnICc7CiAgICBjb3V0IDw8IGVuZGw7CgoKCiAgICByZXR1cm47Cn0KCgpzaWduZWQgbWFpbigpCnsKICAgIGJvb3N0OwoKICAgIC8vIGZyZW9wZW4oImJhbmsuaW4iLCAiciIsIHN0ZGluKTsKICAgIC8vIGZyZW9wZW4oImJhbmsub3V0IiwgInciLCBzdGRvdXQpOwoKICAgIC8vIHByZWNpc2lvbigxNSk7CgogICAgaTMyIF8gPSAxOyAvL2NpbiA+PiBfOwogICAgLy8gY291dC5mbHVzaCgpOwogICAgd2hpbGUoXy0tKSBzb2x2ZSgpOwogICAgcmV0dXJuIDA7Cn0=