Cod sursa(job #1415320)

Utilizator AndreiBarbutaAndrei Barbuta AndreiBarbuta Data 4 aprilie 2015 12:02:33
Problema Range minimum query Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.94 kb
/*
 * 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;
}