Pagini recente » Cod sursa (job #545094) | Cod sursa (job #1164344) | Cod sursa (job #3168819) | Cod sursa (job #2146420) | Cod sursa (job #1415320)
/*
* Code by Spiromanul
*/
# include "fstream"
# include "cstring"
# include "vector"
# include "queue"
# include "bitset"
# include "algorithm"
# include "map"
# include "unordered_map"
# include "deque"
# include "string"
# include "iomanip"
# include "cmath"
# include "stack"
# include "ctime"
# include "cassert"
const char IN [ ] = "rmq.in" ;
const char OUT [ ] = "rmq.out" ;
const int MAX = 133314 ;
# define pb push_back
# define mp make_pair
# define FORN( a , b , c ) for ( int a = b ; a <= c ; ++ a )
# define FORNBACK( a , b , c ) for ( int a = b ; a >= c ; -- a )
using namespace std ;
ifstream cin ( IN ) ;
ofstream cout ( OUT ) ;
vector < int > gr [ MAX ] ;
int stiva [ MAX ] , st ;
int pleasure [ MAX ] , spiridusi [ MAX ] , sp [ MAX ] , tata [ MAX ] , c ;
int sppleasure [ MAX ] , CET ;
bitset < MAX > viz ;
inline void dfs ( int nod , int boss )
{
++ st ;
stiva [ st ] = nod ;
viz [ nod ] = 1 ;
tata [ nod ] = boss ;
sp [ nod ] = sp [ boss ] + spiridusi [ nod ] ;
sppleasure [ nod ] = sppleasure [ boss ] + pleasure [ nod ] ;
for ( auto x : gr [ nod ] )
if ( x != boss )
{
dfs ( x , nod ) ;
}
int bulan = 333 ;
while ( bulan -- )
{
int indice = ( 1LL * rand ( ) * rand ( ) ) % st + 1 ;
if ( sp [ nod ] - sp [ tata [ stiva [ indice ] ] ] <= c )
{
CET = max ( CET , sppleasure [ nod ] - sppleasure [ tata [ stiva [ indice ] ] ] ) ;
}
}
-- st ;
}
int main ( void )
{
srand ( time ( NULL ) ) ;
int n ;
cin >> n >> c ;
FORN ( i , 1 , n )
cin >> spiridusi [ i ] ;
FORN ( i , 1 , n )
cin >> pleasure [ i ] ;
FORN ( i , 1 , n - 1 )
{
int x , y ;
cin >> x >> y ;
gr [ x ].pb ( y ) ;
gr [ y ].pb ( x ) ;
}
dfs ( 1 , 0 ) ;
cout << CET << '\n' ;
return 0;
}