Cod sursa(job #3307413)

Utilizator Iustin_Mircea2010Iustin Mircea Iustin_Mircea2010 Data 20 august 2025 16:44:00
Problema Radiatie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.4 kb
#include <bits/stdc++.h>

using namespace std;

struct edge {
    int u, v, cost;
    bool operator <(const edge& other) const {
        return cost < other.cost;
    }
}e[30005];

int anc[15005][17], rmq[15005][17], siz[15005], lead[15005], depth[15005];
bool viz[15005];
vector<pair<int, int>> adj[15005];

int find(int u) {
    if (u == lead[u]) return u;
    return lead[u] = find(lead[u]);
}

void unite(int u, int v) {
    if (siz[u] > siz[v]) swap(u, v);
    lead[u] = v;
    siz[u] += siz[v];
}

void dfs(int u, int par, int cost) {
    viz[u] = true;
    depth[u] = depth[par] + 1;
    anc[u][0] = par;
    if (par != 0) rmq[u][0] = cost;
    for (auto [v, c] : adj[u]) {
        if (v == par) continue;
        dfs(v, u, c);
    }
}

int solve(int u, int v) {
    if (depth[u] < depth[v]) swap(u, v);
    int dif = depth[u] - depth[v], ans = 0;
    while (dif) {
        int b = 31 - __builtin_clz(dif);
        ans = max(ans, rmq[u][b]);
        u = anc[u][b];
        dif -= 1 << b;
    }
    if (u == v)
        return ans;
    for (int b = 16; b >= 0; b--) {
        if (anc[u][b] != anc[v][b]) {
            ans = max(ans, rmq[u][b]);
            ans = max(ans, rmq[v][b]);
            u = anc[u][b];
            v = anc[v][b];
        }
    }
    ans = max(ans, rmq[u][0]);
    ans = max(ans, rmq[v][0]);
    return ans;
}

int main() {

    ifstream cin("radiatie.in");
    ofstream cout("radiatie.out");

    int n, m, q;
    cin >> n >> m >> q;
    for (int i = 1; i <= n; i++) {
        siz[i] = 1;
        lead[i] = i;
    }
    for (int i = 1; i <= m; i++) {
        cin >> e[i].u >> e[i].v >> e[i].cost;
    }
    sort(e + 1, e + m + 1);
    for (int i = 1; i <= m; i++) {
        int uu = find(e[i].u);
        int vv = find(e[i].v);
        if (uu == vv) continue;
        unite(uu, vv);
        adj[e[i].u].push_back({e[i].v, e[i].cost});
        adj[e[i].v].push_back({e[i].u, e[i].cost});
    }
    for (int i = 1; i <= n; i++) {
        if (viz[i] == false) {
            dfs(i, 0, 0);
        }
    }
    for (int b = 1; b < 17; b++) {
        for (int i = 1; i <= n; i++) {
            anc[i][b] = anc[anc[i][b - 1]][b - 1];
            rmq[i][b] = max(rmq[i][b - 1], rmq[anc[i][b - 1]][b - 1]);
        }
    }
    while (q--) {
        int x, y;
        cin >> x >> y;
        cout << solve(x, y) << '\n';
    }
    return 0;
}