#pragma GCC optimize("Ofast")
#pragma GCC optimize("unroll-loops")
#pragma GCC optimize("inline")
#include<bits/stdc++.h>
using namespace std;
template < class T> struct cLtraits_identity{
using type = T;
}
;
template < class T> using cLtraits_try_make_signed =
typename conditional<
is_integral< T> :: value ,
make_signed< T> ,
cLtraits_identity< T>
> :: type ;
template < class S, class T> struct cLtraits_common_type{
using tS = typename cLtraits_try_make_signed< S> :: type ;
using tT = typename cLtraits_try_make_signed< T> :: type ;
using type = typename common_type< tS,tT> :: type ;
}
;
void * wmem;
char memarr[ 96000000 ] ;
template < class S, class T> inline auto max_L( S a, T b)
- > typename cLtraits_common_type< S,T> :: type {
return ( typename cLtraits_common_type< S,T> :: type ) a >= ( typename cLtraits_common_type< S,T> :: type ) b ? a : b;
}
template < class T> inline void walloc1d( T ** arr, int x, void ** mem = & wmem) {
static int skip[ 16 ] = { 0 , 15 , 14 , 13 , 12 , 11 , 10 , 9 , 8 , 7 , 6 , 5 , 4 , 3 , 2 , 1 } ;
( * mem) = ( void * ) ( ( ( char * ) ( * mem) ) + skip[ ( ( unsigned long long ) ( * mem) ) & 15 ] ) ;
( * arr) = ( T* ) ( * mem) ;
( * mem) = ( ( * arr) + x) ;
}
template < class T> inline void walloc1d( T ** arr, int x1, int x2, void ** mem = & wmem) {
walloc1d( arr, x2- x1, mem) ;
( * arr) - = x1;
}
struct graph{
int N;
int * es;
int ** edge;
void setEdgeRootedTree( int N__, int M, int A[ ] , int B[ ] , int root= 0 , int reorder= 0 , int cnv[ ] = NULL , void ** mem = & wmem) {
int i;
int j;
int k;
int * dist;
int * q;
int qs;
int qe;
int * ind;
void * tmem;
N = N__;
tmem = ( ( char * ) ( * mem) ) + ( sizeof ( int ) * N + 15 ) + ( sizeof ( int * ) * N + 15 ) + ( sizeof ( int ) * M + 15 * N) ;
walloc1d( & es, N, mem) ;
walloc1d( & edge, N, mem) ;
for ( i= ( 0 ) ; i< ( N) ; i++ ) {
es[ i] = 0 ;
}
for ( i= ( 0 ) ; i< ( M) ; i++ ) {
es[ A[ i] ] ++ ;
es[ B[ i] ] ++ ;
}
for ( i= ( 0 ) ; i< ( N) ; i++ ) {
walloc1d( & edge[ i] , es[ i] , & tmem) ;
}
for ( i= ( 0 ) ; i< ( N) ; i++ ) {
es[ i] = 0 ;
}
for ( i= ( 0 ) ; i< ( M) ; i++ ) {
edge[ A[ i] ] [ es[ A[ i] ] ++ ] = B[ i] ;
edge[ B[ i] ] [ es[ B[ i] ] ++ ] = A[ i] ;
}
walloc1d( & dist, N, & tmem) ;
walloc1d( & q, N, & tmem) ;
walloc1d( & ind, N, & tmem) ;
if ( cnv== NULL ) {
walloc1d( & cnv, N, & tmem) ;
}
for ( i= ( 0 ) ; i< ( N) ; i++ ) {
dist[ i] = - 1 ;
}
dist[ root] = 0 ;
qs = qe = 0 ;
q[ qe++ ] = root;
while ( qs < qe) {
i = q[ qs++ ] ;
for ( j= ( 0 ) ; j< ( es[ i] ) ; j++ ) {
k = edge[ i] [ j] ;
if ( dist[ k] == - 1 ) {
dist[ k] = dist[ i] + 1 ;
q[ qe++ ] = k;
}
}
}
if ( reorder == 0 ) {
for ( i= ( 0 ) ; i< ( N) ; i++ ) {
cnv[ i] = i;
}
for ( i= ( 0 ) ; i< ( N) ; i++ ) {
ind[ i] = i;
}
}
else {
for ( i= ( 0 ) ; i< ( N) ; i++ ) {
cnv[ i] = q[ i] ;
}
for ( i= ( 0 ) ; i< ( N) ; i++ ) {
ind[ cnv[ i] ] = i;
}
}
for ( i= ( 0 ) ; i< ( N) ; i++ ) {
es[ i] = 0 ;
}
for ( i= ( 0 ) ; i< ( M) ; i++ ) {
j = A[ i] ;
k = B[ i] ;
if ( dist[ j] > dist[ k] ) {
swap( j, k) ;
}
es[ ind[ j] ] ++ ;
}
for ( i= ( 0 ) ; i< ( N) ; i++ ) {
walloc1d( & edge[ i] , es[ i] , mem) ;
}
for ( i= ( 0 ) ; i< ( N) ; i++ ) {
es[ i] = 0 ;
}
for ( i= ( 0 ) ; i< ( M) ; i++ ) {
j = A[ i] ;
k = B[ i] ;
if ( dist[ j] > dist[ k] ) {
swap( j, k) ;
}
j = ind[ j] ;
k = ind[ k] ;
edge[ j] [ es[ j] ++ ] = k;
}
}
}
;
template < class T, class S> inline int vec2arr( vector< T> & v, S arr[ ] ) {
int i;
int N = v.size ( ) ;
for ( i= ( 0 ) ; i< ( N) ; i++ ) {
arr[ i] = v[ i] ;
}
return N;
}
template < class T, class S1, class S2> inline int vec2arr( vector< vector< T>> & v, S1 arr1[ ] , S2 arr2[ ] ) {
int i;
int N = v.size ( ) ;
for ( i= ( 0 ) ; i< ( N) ; i++ ) {
arr1[ i] = v[ i] [ 0 ] ;
arr2[ i] = v[ i] [ 1 ] ;
}
return N;
}
template < class T, class S1, class S2, class S3> inline int vec2arr( vector< vector< T>> & v, S1 arr1[ ] , S2 arr2[ ] , S3 arr3[ ] ) {
int i;
int N = v.size ( ) ;
for ( i= ( 0 ) ; i< ( N) ; i++ ) {
arr1[ i] = v[ i] [ 0 ] ;
arr2[ i] = v[ i] [ 1 ] ;
arr3[ i] = v[ i] [ 2 ] ;
}
return N;
}
#define main dummy_main
int main( ) {
wmem = memarr;
return 0 ;
}
#undef main
graph g;
int C[ 100000 ] ;
int N;
int a[ 100000 ] ;
int b[ 100000 ] ;
int K;
int dp[ 100000 ] [ 15 ] ;
int solve( int a, int m) {
int Nzj9Y0kE;
int r1;
int r2;
if ( m >= 15 ) {
return 0 ;
}
if ( dp[ a] [ m] >= 0 ) {
return dp[ a] [ m] ;
}
r1 = ( C[ a] >> m) - K;
r2 = ( C[ a] >> m) / 2 ;
for ( Nzj9Y0kE= ( 0 ) ; Nzj9Y0kE< ( g.es [ a] ) ; Nzj9Y0kE++ ) {
auto & i = g.edge [ a] [ Nzj9Y0kE] ;
r1 + = solve( i,m) ;
r2 + = solve( i,m+ 1 ) ;
}
return dp[ a] [ m] = max_L( r1, r2) ;
}
class Solution{
public :
int maximumPoints( vector< vector< int >> & edges, vector< int > & coins, int k) {
int i;
dummy_main( ) ;
K = k;
N = vec2arr( coins, C) ;
vec2arr( edges, a, b) ;
g.setEdgeRootedTree ( N,N- 1 ,a,b) ;
for ( i= ( 0 ) ; i< ( N) ; i++ ) {
int j;
for ( j= ( 0 ) ; j< ( 15 ) ; j++ ) {
dp[ i] [ j] = - 1 ;
}
}
return solve( 0 ,0 ) ;
}
}
;
// cLay version 20231031-1
// --- original code ---
// #define main dummy_main
// {}
// #undef main
//
// graph g;
// int C[1d5];
// int N, a[1d5], b[1d5], K;
// int dp[1d5][15];
//
// int solve(int a, int m){
// int r1, r2;
//
// if(m >= 15) return 0;
// if(dp[a][m] >= 0) return dp[a][m];
//
// r1 = (C[a]>>m) - K;
// r2 = (C[a]>>m) / 2;
// rep[g.edge[a]](i,g.es[a]){
// r1 += solve(i,m);
// r2 += solve(i,m+1);
// }
//
// return dp[a][m] = max(r1, r2);
// }
//
// class Solution {
// public:
// int maximumPoints(VVI &edges, VI &coins, int k) {
// dummy_main();
//
// K = k;
// N = vec2arr(coins, C);
// vec2arr(edges, a, b);
// g.setEdgeRootedTree(N,N-1,a,b);
//
// rep(i,N) rep(j,15) dp[i][j] = -1;
// return solve(0,0);
// }
// };
I3ByYWdtYSBHQ0Mgb3B0aW1pemUoIk9mYXN0IikKI3ByYWdtYSBHQ0Mgb3B0aW1pemUoInVucm9sbC1sb29wcyIpCiNwcmFnbWEgR0NDIG9wdGltaXplKCJpbmxpbmUiKQojaW5jbHVkZTxiaXRzL3N0ZGMrKy5oPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwp0ZW1wbGF0ZTxjbGFzcyBUPiBzdHJ1Y3QgY0x0cmFpdHNfaWRlbnRpdHl7CiAgdXNpbmcgdHlwZSA9IFQ7Cn0KOwp0ZW1wbGF0ZTxjbGFzcyBUPiB1c2luZyBjTHRyYWl0c190cnlfbWFrZV9zaWduZWQgPQogIHR5cGVuYW1lIGNvbmRpdGlvbmFsPAogICAgaXNfaW50ZWdyYWw8VD46OnZhbHVlLAogICAgbWFrZV9zaWduZWQ8VD4sCiAgICBjTHRyYWl0c19pZGVudGl0eTxUPgogICAgPjo6dHlwZTsKdGVtcGxhdGUgPGNsYXNzIFMsIGNsYXNzIFQ+IHN0cnVjdCBjTHRyYWl0c19jb21tb25fdHlwZXsKICB1c2luZyB0UyA9IHR5cGVuYW1lIGNMdHJhaXRzX3RyeV9tYWtlX3NpZ25lZDxTPjo6dHlwZTsKICB1c2luZyB0VCA9IHR5cGVuYW1lIGNMdHJhaXRzX3RyeV9tYWtlX3NpZ25lZDxUPjo6dHlwZTsKICB1c2luZyB0eXBlID0gdHlwZW5hbWUgY29tbW9uX3R5cGU8dFMsdFQ+Ojp0eXBlOwp9CjsKdm9pZCp3bWVtOwpjaGFyIG1lbWFycls5NjAwMDAwMF07CnRlbXBsYXRlPGNsYXNzIFMsIGNsYXNzIFQ+IGlubGluZSBhdXRvIG1heF9MKFMgYSwgVCBiKQotPiB0eXBlbmFtZSBjTHRyYWl0c19jb21tb25fdHlwZTxTLFQ+Ojp0eXBlewogIHJldHVybiAodHlwZW5hbWUgY0x0cmFpdHNfY29tbW9uX3R5cGU8UyxUPjo6dHlwZSkgYSA+PSAodHlwZW5hbWUgY0x0cmFpdHNfY29tbW9uX3R5cGU8UyxUPjo6dHlwZSkgYiA/IGEgOiBiOwp9CnRlbXBsYXRlPGNsYXNzIFQ+IGlubGluZSB2b2lkIHdhbGxvYzFkKFQgKiphcnIsIGludCB4LCB2b2lkICoqbWVtID0gJndtZW0pewogIHN0YXRpYyBpbnQgc2tpcFsxNl0gPSB7MCwgMTUsIDE0LCAxMywgMTIsIDExLCAxMCwgOSwgOCwgNywgNiwgNSwgNCwgMywgMiwgMX07CiAgKCptZW0pID0gKHZvaWQqKSggKChjaGFyKikoKm1lbSkpICsgc2tpcFsoKHVuc2lnbmVkIGxvbmcgbG9uZykoKm1lbSkpICYgMTVdICk7CiAgKCphcnIpPShUKikoKm1lbSk7CiAgKCptZW0pPSgoKmFycikreCk7Cn0KdGVtcGxhdGU8Y2xhc3MgVD4gaW5saW5lIHZvaWQgd2FsbG9jMWQoVCAqKmFyciwgaW50IHgxLCBpbnQgeDIsIHZvaWQgKiptZW0gPSAmd21lbSl7CiAgd2FsbG9jMWQoYXJyLCB4Mi14MSwgbWVtKTsKICAoKmFycikgLT0geDE7Cn0Kc3RydWN0IGdyYXBoewogIGludCBOOwogIGludCplczsKICBpbnQqKmVkZ2U7CiAgdm9pZCBzZXRFZGdlUm9vdGVkVHJlZShpbnQgTl9fLCBpbnQgTSwgaW50IEFbXSwgaW50IEJbXSwgaW50IHJvb3Q9MCwgaW50IHJlb3JkZXI9MCwgaW50IGNudltdID0gTlVMTCwgdm9pZCAqKm1lbSA9ICZ3bWVtKXsKICAgIGludCBpOwogICAgaW50IGo7CiAgICBpbnQgazsKICAgIGludCpkaXN0OwogICAgaW50KnE7CiAgICBpbnQgcXM7CiAgICBpbnQgcWU7CiAgICBpbnQqaW5kOwogICAgdm9pZCp0bWVtOwogICAgTiA9IE5fXzsKICAgIHRtZW0gPSAoKGNoYXIqKSgqbWVtKSkgKyAoc2l6ZW9mKGludCkgKiBOICsgMTUpICsgKHNpemVvZihpbnQqKSAqIE4gKyAxNSkgKyAoc2l6ZW9mKGludCkgKiBNICsgMTUgKiBOKTsKICAgIHdhbGxvYzFkKCZlcywgTiwgbWVtKTsKICAgIHdhbGxvYzFkKCZlZGdlLCBOLCBtZW0pOwogICAgZm9yKGk9KDApO2k8KE4pO2krKyl7CiAgICAgIGVzW2ldID0gMDsKICAgIH0KICAgIGZvcihpPSgwKTtpPChNKTtpKyspewogICAgICBlc1tBW2ldXSsrOwogICAgICBlc1tCW2ldXSsrOwogICAgfQogICAgZm9yKGk9KDApO2k8KE4pO2krKyl7CiAgICAgIHdhbGxvYzFkKCZlZGdlW2ldLCBlc1tpXSwgJnRtZW0pOwogICAgfQogICAgZm9yKGk9KDApO2k8KE4pO2krKyl7CiAgICAgIGVzW2ldID0gMDsKICAgIH0KICAgIGZvcihpPSgwKTtpPChNKTtpKyspewogICAgICBlZGdlW0FbaV1dW2VzW0FbaV1dKytdID0gQltpXTsKICAgICAgZWRnZVtCW2ldXVtlc1tCW2ldXSsrXSA9IEFbaV07CiAgICB9CiAgICB3YWxsb2MxZCgmZGlzdCwgTiwgJnRtZW0pOwogICAgd2FsbG9jMWQoJnEsIE4sICZ0bWVtKTsKICAgIHdhbGxvYzFkKCZpbmQsIE4sICZ0bWVtKTsKICAgIGlmKGNudj09TlVMTCl7CiAgICAgIHdhbGxvYzFkKCZjbnYsIE4sICZ0bWVtKTsKICAgIH0KICAgIGZvcihpPSgwKTtpPChOKTtpKyspewogICAgICBkaXN0W2ldID0gLTE7CiAgICB9CiAgICBkaXN0W3Jvb3RdID0gMDsKICAgIHFzID0gcWUgPSAwOwogICAgcVtxZSsrXSA9IHJvb3Q7CiAgICB3aGlsZShxcyA8IHFlKXsKICAgICAgaSA9IHFbcXMrK107CiAgICAgIGZvcihqPSgwKTtqPChlc1tpXSk7aisrKXsKICAgICAgICBrID0gZWRnZVtpXVtqXTsKICAgICAgICBpZihkaXN0W2tdPT0tMSl7CiAgICAgICAgICBkaXN0W2tdID0gZGlzdFtpXSArIDE7CiAgICAgICAgICBxW3FlKytdID0gazsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGlmKHJlb3JkZXIgPT0gMCl7CiAgICAgIGZvcihpPSgwKTtpPChOKTtpKyspewogICAgICAgIGNudltpXSA9IGk7CiAgICAgIH0KICAgICAgZm9yKGk9KDApO2k8KE4pO2krKyl7CiAgICAgICAgaW5kW2ldID0gaTsKICAgICAgfQogICAgfQogICAgZWxzZXsKICAgICAgZm9yKGk9KDApO2k8KE4pO2krKyl7CiAgICAgICAgY252W2ldID0gcVtpXTsKICAgICAgfQogICAgICBmb3IoaT0oMCk7aTwoTik7aSsrKXsKICAgICAgICBpbmRbY252W2ldXSA9IGk7CiAgICAgIH0KICAgIH0KICAgIGZvcihpPSgwKTtpPChOKTtpKyspewogICAgICBlc1tpXSA9IDA7CiAgICB9CiAgICBmb3IoaT0oMCk7aTwoTSk7aSsrKXsKICAgICAgaiA9IEFbaV07CiAgICAgIGsgPSBCW2ldOwogICAgICBpZihkaXN0W2pdID4gZGlzdFtrXSl7CiAgICAgICAgc3dhcChqLCBrKTsKICAgICAgfQogICAgICBlc1tpbmRbal1dKys7CiAgICB9CiAgICBmb3IoaT0oMCk7aTwoTik7aSsrKXsKICAgICAgd2FsbG9jMWQoJmVkZ2VbaV0sIGVzW2ldLCBtZW0pOwogICAgfQogICAgZm9yKGk9KDApO2k8KE4pO2krKyl7CiAgICAgIGVzW2ldID0gMDsKICAgIH0KICAgIGZvcihpPSgwKTtpPChNKTtpKyspewogICAgICBqID0gQVtpXTsKICAgICAgayA9IEJbaV07CiAgICAgIGlmKGRpc3Rbal0gPiBkaXN0W2tdKXsKICAgICAgICBzd2FwKGosIGspOwogICAgICB9CiAgICAgIGogPSBpbmRbal07CiAgICAgIGsgPSBpbmRba107CiAgICAgIGVkZ2Vbal1bZXNbal0rK10gPSBrOwogICAgfQogIH0KfQo7CnRlbXBsYXRlPGNsYXNzIFQsIGNsYXNzIFM+IGlubGluZSBpbnQgdmVjMmFycih2ZWN0b3I8VD4gJnYsIFMgYXJyW10pewogIGludCBpOwogIGludCBOID0gdi5zaXplKCk7CiAgZm9yKGk9KDApO2k8KE4pO2krKyl7CiAgICBhcnJbaV0gPSB2W2ldOwogIH0KICByZXR1cm4gTjsKfQp0ZW1wbGF0ZTxjbGFzcyBULCBjbGFzcyBTMSwgY2xhc3MgUzI+IGlubGluZSBpbnQgdmVjMmFycih2ZWN0b3I8dmVjdG9yPFQ+PiAmdiwgUzEgYXJyMVtdLCBTMiBhcnIyW10pewogIGludCBpOwogIGludCBOID0gdi5zaXplKCk7CiAgZm9yKGk9KDApO2k8KE4pO2krKyl7CiAgICBhcnIxW2ldID0gdltpXVswXTsKICAgIGFycjJbaV0gPSB2W2ldWzFdOwogIH0KICByZXR1cm4gTjsKfQp0ZW1wbGF0ZTxjbGFzcyBULCBjbGFzcyBTMSwgY2xhc3MgUzIsIGNsYXNzIFMzPiBpbmxpbmUgaW50IHZlYzJhcnIodmVjdG9yPHZlY3RvcjxUPj4gJnYsIFMxIGFycjFbXSwgUzIgYXJyMltdLCBTMyBhcnIzW10pewogIGludCBpOwogIGludCBOID0gdi5zaXplKCk7CiAgZm9yKGk9KDApO2k8KE4pO2krKyl7CiAgICBhcnIxW2ldID0gdltpXVswXTsKICAgIGFycjJbaV0gPSB2W2ldWzFdOwogICAgYXJyM1tpXSA9IHZbaV1bMl07CiAgfQogIHJldHVybiBOOwp9CiNkZWZpbmUgbWFpbiBkdW1teV9tYWluCmludCBtYWluKCl7CiAgd21lbSA9IG1lbWFycjsKICByZXR1cm4gMDsKfQojdW5kZWYgbWFpbgpncmFwaCBnOwppbnQgQ1sxMDAwMDBdOwppbnQgTjsKaW50IGFbMTAwMDAwXTsKaW50IGJbMTAwMDAwXTsKaW50IEs7CmludCBkcFsxMDAwMDBdWzE1XTsKaW50IHNvbHZlKGludCBhLCBpbnQgbSl7CiAgaW50IE56ajlZMGtFOwogIGludCByMTsKICBpbnQgcjI7CiAgaWYobSA+PSAxNSl7CiAgICByZXR1cm4gMDsKICB9CiAgaWYoZHBbYV1bbV0gPj0gMCl7CiAgICByZXR1cm4gZHBbYV1bbV07CiAgfQogIHIxID0gKENbYV0+Pm0pIC0gSzsKICByMiA9IChDW2FdPj5tKSAvIDI7CiAgZm9yKE56ajlZMGtFPSgwKTtOemo5WTBrRTwoZy5lc1thXSk7TnpqOVkwa0UrKyl7CiAgICBhdXRvJmkgPSBnLmVkZ2VbYV1bTnpqOVkwa0VdOwogICAgcjEgKz0gc29sdmUoaSxtKTsKICAgIHIyICs9IHNvbHZlKGksbSsxKTsKICB9CiAgcmV0dXJuIGRwW2FdW21dID1tYXhfTChyMSwgcjIpOwp9CmNsYXNzIFNvbHV0aW9uewogIHB1YmxpYzoKICBpbnQgbWF4aW11bVBvaW50cyh2ZWN0b3I8dmVjdG9yPGludD4+ICZlZGdlcywgdmVjdG9yPGludD4gJmNvaW5zLCBpbnQgayl7CiAgICBpbnQgaTsKICAgIGR1bW15X21haW4oKTsKICAgIEsgPSBrOwogICAgTiA9IHZlYzJhcnIoY29pbnMsIEMpOwogICAgdmVjMmFycihlZGdlcywgYSwgYik7CiAgICBnLnNldEVkZ2VSb290ZWRUcmVlKE4sTi0xLGEsYik7CiAgICBmb3IoaT0oMCk7aTwoTik7aSsrKXsKICAgICAgaW50IGo7CiAgICAgIGZvcihqPSgwKTtqPCgxNSk7aisrKXsKICAgICAgICBkcFtpXVtqXSA9IC0xOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gc29sdmUoMCwwKTsKICB9Cn0KOwovLyBjTGF5IHZlcnNpb24gMjAyMzEwMzEtMQoKLy8gLS0tIG9yaWdpbmFsIGNvZGUgLS0tCi8vICNkZWZpbmUgbWFpbiBkdW1teV9tYWluCi8vIHt9Ci8vICN1bmRlZiBtYWluCi8vIAovLyBncmFwaCBnOwovLyBpbnQgQ1sxZDVdOwovLyBpbnQgTiwgYVsxZDVdLCBiWzFkNV0sIEs7Ci8vIGludCBkcFsxZDVdWzE1XTsKLy8gCi8vIGludCBzb2x2ZShpbnQgYSwgaW50IG0pewovLyAgIGludCByMSwgcjI7Ci8vIAovLyAgIGlmKG0gPj0gMTUpIHJldHVybiAwOwovLyAgIGlmKGRwW2FdW21dID49IDApIHJldHVybiBkcFthXVttXTsKLy8gCi8vICAgcjEgPSAoQ1thXT4+bSkgLSBLOwovLyAgIHIyID0gKENbYV0+Pm0pIC8gMjsKLy8gICByZXBbZy5lZGdlW2FdXShpLGcuZXNbYV0pewovLyAgICAgcjEgKz0gc29sdmUoaSxtKTsKLy8gICAgIHIyICs9IHNvbHZlKGksbSsxKTsKLy8gICB9Ci8vIAovLyAgIHJldHVybiBkcFthXVttXSA9IG1heChyMSwgcjIpOwovLyB9Ci8vIAovLyBjbGFzcyBTb2x1dGlvbiB7Ci8vIHB1YmxpYzoKLy8gICBpbnQgbWF4aW11bVBvaW50cyhWVkkgJmVkZ2VzLCBWSSAmY29pbnMsIGludCBrKSB7Ci8vICAgICBkdW1teV9tYWluKCk7Ci8vIAovLyAgICAgSyA9IGs7Ci8vICAgICBOID0gdmVjMmFycihjb2lucywgQyk7Ci8vICAgICB2ZWMyYXJyKGVkZ2VzLCBhLCBiKTsKLy8gICAgIGcuc2V0RWRnZVJvb3RlZFRyZWUoTixOLTEsYSxiKTsKLy8gCi8vICAgICByZXAoaSxOKSByZXAoaiwxNSkgZHBbaV1bal0gPSAtMTsKLy8gICAgIHJldHVybiBzb2x2ZSgwLDApOwovLyAgIH0KLy8gfTsK