Cod sursa(job #3308484)

Utilizator iulia_morariuIuli Morariu iulia_morariu Data 25 august 2025 14:08:56
Problema Radiatie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.43 kb
#include <algorithm>
#include <iostream>
#include <fstream>
#include <climits>
#include <vector>
#include <stack>
#include <cmath>
// #include <bits/stdc++.h>
#define in  fin
#define out fout

using namespace std;

ifstream fin("radiatie.in");
ofstream fout("radiatie.out");

int f[15001];
int s[15001];

vector< pair<int, int> > g[15001];

int find_father(int x){
    if( f[x] == x ) return x;
    f[x] = find_father( f[x] );
    return f[x];
}

void merge(int a, int b, int c){
    int fa = find_father(a);
    int fb = find_father(b);

    if(fa == fb) return; // is deja merged :)
    
    // mch.push_back( make_pair(a, b) );
    g[a].push_back( make_pair(b, c) );
    g[b].push_back( make_pair(a, c) );

    if(s[a] > s[b]){
        f[fb] = fa;
        s[fa] += s[fb]; 
    }else{
        f[fa] = fb;
        s[fb] += s[fa];
    }
}

struct muchie{
    int a, b, c;

    bool operator<(const muchie &b) const {
        return c < b.c;
    }
};

int niv[15001];
int lca[15001][15];
int mx[15001][15];

void dfs(int nod, int f) {
    for(const pair<int, int> &x : g[nod]){
        if(x.first == f) continue;
        niv[x.first] = niv[nod] + 1;
        lca[x.first][0] = nod;
        mx[x.first][0] = x.second;
        for(int j = 1; j < 15; j++) {
            lca[x.first][j] = lca[lca[x.first][j - 1]][j - 1];
            mx[x.first][j] = max(mx[x.first][j - 1], mx[lca[x.first][j - 1]][j - 1]);
        }
        dfs(x.first, nod);
    }
}

int query(int a, int b){
    if(niv[b] > niv[a]) swap(a, b); // sa fie a cel mai jos

    int sol = 0;
    for(int i = 14; i >= 0; i--){
        if( (niv[a] - niv[b]) & (1 << i) ){
            sol = max(sol, mx[a][i]);
            a = lca[a][i];
        }
    }

    if(a == b) return sol;

    for(int i = 14; i >= 0; i--){
        if(lca[a][i] != lca[b][i]){
            sol = max(sol, mx[a][i]);
            sol = max(sol, mx[b][i]);
            a = lca[a][i]; b = lca[b][i];
        }
    }

    sol = max( max(mx[a][0], mx[b][0]), sol );
    return sol;
}

signed main(){
    ios_base::sync_with_stdio(false);
    in.tie(NULL);

    int n, m, q; in >> n >> m >> q;
    muchie v[m];

    for(int i = 0; i < m; i++) in >> v[i].a >> v[i].b >> v[i].c;

    sort(v + 0, v + m);

    for(int i = 0; i <= n; i++){ f[i] = i; s[i] = 1; }
    for(int i = 0; i < m; i++) merge( v[i].a, v[i].b, v[i].c );

    dfs(1, -1);

    for(int i = 0; i < q; i++){
        int a, b; in >> a >> b;
        out << query(a, b) << '\n';
    }

    return 0;
}