Cod sursa(job #3351669)

Utilizator SkibidiCezarCezar Bolba SkibidiCezar Data 20 aprilie 2026 19:29:43
Problema Radiatie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.37 kb
#include <bits/stdc++.h>
#define in fin
#define out fout
#define f first
#define s second

using namespace std;
ifstream fin ("radiatie.in");
ofstream fout ("radiatie.out");
int n, m, k, x, y, maxim;
struct much{
    int a, b, c;
};
much e[30005];
bool cmp(much a, much b){
    return a.c < b.c;
}
int p[15005], d[15005];
void find_father(int nod){
    if(p[nod] != p[p[nod]]){
        find_father(p[nod]);
        p[nod] = p[p[nod]];
    }
}
vector < pair <int, int> > v[15005];
pair <int, int> unc[16][15005];
void dfs(int nod, int nig){
    d[nod] = d[nig] + 1;
    for(int i = 0; i < v[nod].size(); i++){
        if(v[nod][i].f != nig){
            unc[0][v[nod][i].f] = {nod, v[nod][i].s};
            dfs(v[nod][i].f, nod);
        }
    }
}
void build_sparse_table(){
    for(int i = 1; (1 << i) <= n; i++){
        for(int j = 1; j <= n; j++){
            unc[i][j] = {unc[i-1][unc[i-1][j].f].f,
            max(unc[i-1][j].s, unc[i-1][unc[i-1][j].f].s)};
        }
    }
}

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    in >> n >> m >> k;
    for(int i = 1; i <= n; i++){
        p[i] = i;
    }
    for(int i = 1; i <= m; i++){
        in >> e[i].a >> e[i].b >> e[i].c;
    }
    sort(e + 1, e + m + 1, cmp);
    for(int i = 1; i <= m; i++){
        find_father(e[i].a);
        find_father(e[i].b);
        if(p[e[i].a] != p[e[i].b]){
            p[p[e[i].b]] = p[e[i].a];
            v[e[i].a].push_back({e[i].b, e[i].c});
            v[e[i].b].push_back({e[i].a, e[i].c});
        }
    }
    dfs(1, 0);
    build_sparse_table();
    while(k--){
        in >> x >> y;
        maxim = 0;
        for(int i = 15; i >= 0; i--){
            if(d[unc[i][x].f] >= d[y]){
                maxim = max(maxim, unc[i][x].s);
                x = unc[i][x].f;
            }
            else if(d[unc[i][y].f] >= d[x]){
                maxim = max(maxim, unc[i][y].s);
                y = unc[i][y].f;
            }
        }
        for(int i = 15; i >= 0; i--){
            if(unc[i][x].f != unc[i][y].f){
                maxim = max(maxim, max(unc[i][x].s, unc[i][y].s));
                x = unc[i][x].f;
                y = unc[i][y].f;
            }
        }
        if(x != y){
            maxim = max(maxim, max(unc[0][x].s, unc[0][y].s));
        }
        out << maxim << "\n";
    }
    return 0;
}