Cod sursa(job #2098888)

Utilizator robx12lnLinca Robert robx12ln Data 3 ianuarie 2018 17:22:37
Problema Radiatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.75 kb
#include<fstream>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;
ifstream fin("radiatie.in");
ofstream fout("radiatie.out");
int N, M, Q, T[15005], Lca[15005][16], Rmq[15005][16], R, Niv[15005], LOG, f[30005];
vector< pair<int,int> > v[15005];
void dfs( int nod, int nr ){
    Niv[nod] = nr;
    for( int i = 0; i < v[nod].size(); i++ ){
        if( Niv[ v[nod][i].first ] == 0 ){
            Lca[ v[nod][i].first ][0] = nod;
            Rmq[ v[nod][i].first ][0] = v[nod][i].second;
            dfs( v[nod][i].first, nr + 1 );
        }
    }
    return;
}
struct str{
    int x, y, C;
} P[30005];
inline int cmp( const str &a, const str &b ){
    return a.C < b.C;
}
int rad( int nod ){
    if( T[nod] < 0 )
        return nod;
    return rad( T[nod] );
}
inline int LCA( int a, int b ){
    if( Niv[a] > Niv[b] )
        swap( a, b );
    int D = Niv[b] - Niv[a];
    int x = 0;
    while( D != 0 ){
        if( ( D & 1 ) == 1 )
            b = Lca[b][x];
        x++;
        D >>= 1;
    }
    for( int i = LOG; i >= 0; i-- ){
        if( Lca[a][i] != Lca[b][i] ){
            a = Lca[a][i];
            b = Lca[b][i];
        }
    }
    if( a == b )
        return a;
    else
        return Lca[a][0];
}
inline int solve( int nod, int D ){
    int r = 0;
    int x = 0;
    while( D != 0 ){
        if( ( D & 1 ) == 1 ){
            r = max( r, Rmq[nod][x] );
            nod = Lca[nod][x];
        }
        x++;
        D >>= 1;
    }
    return r;
}
int main(){
    fin >> N >> M >> Q;
    for( int i = 1; i <= M; i++ )
        fin >> P[i].x >> P[i].y >> P[i].C;
    sort( P + 1,  P + M + 1, cmp );
    memset( T, -1, sizeof(T) );
    for( int i = 1; i <= M; i++ ){
        int a = rad( P[i].x );
        int b = rad( P[i].y );
        if( a == b )
            continue;
        if( T[a] < T[b] ){
            T[a] += T[b];
            T[b] = a;
        }else{
            T[b] += T[a];
            T[a] = b;
        }
        f[i] = 1;
    }
    for( int i = 1; i <= M; i++ ){
        if( f[i] == 1 ){
            v[ P[i].x ].push_back( make_pair( P[i].y, P[i].C ) );
            v[ P[i].y ].push_back( make_pair( P[i].x, P[i].C ) );
        }
    }
    dfs( 1, 1 );
    for( int k = 1; (1<<k) <= N; k++, LOG = k )
        for( int i = 1; i <= N; i++ )
            Lca[i][k] = Lca[ Lca[i][k - 1] ][k - 1];
    for( int k = 1; (1<<k) <= N; k++ )
        for( int i = 1; i <= N; i++ )
            Rmq[i][k] = max( Rmq[i][k - 1], Rmq[ Lca[i][k - 1] ][k - 1] );
    for( ; Q != 0; Q-- ){
        int X, Y;
        fin >> X >> Y;
        int nod = LCA( X, Y );
        fout << max( solve( X, Niv[X] - Niv[nod] ), solve( Y, Niv[Y] - Niv[nod] ) ) << "\n";
    }
    return 0;
}