Cod sursa(job #3353532)

Utilizator AdrianRosuRosu Adrian Andrei AdrianRosu Data 7 mai 2026 21:57:45
Problema Radiatie Scor 100
Compilator cpp-64 Status done
Runda cerc-acs-02-05-26 Marime 2.33 kb
#include <bits/stdc++.h>
#define DIM 15005
using namespace std;

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

int n, m, k, x, y, c;
int t[DIM], niv[DIM];
int rmq[18][DIM], maxi[18][DIM];

struct elem
{
    int x, y, c;
};

elem mch[DIM * 2];

vector< pair <int, int> > v[DIM];

bool cmp(const elem& a, const elem& b)
{
    return a.c < b.c;

}

int get_root(int x)
{
    if(t[x] > 0) {
        int y = get_root(t[x]);
        t[x] = y;
        return y;
    }
    return x;
}

void join(int x,int y,int c)
{
    int rx=get_root(x), ry=get_root(y);

    if(rx == ry) {
        return ;
    }

    v[x].push_back({y,c});
    v[y].push_back({x,c});

    if(t[rx] > t[ry]) {
        swap(rx,ry);
    }

    t[rx] += t[ry];
    t[ry] = rx;

}

void apm()
{
    sort(mch + 1,mch + m + 1, cmp);

    for (int i = 1; i <= m; i++) {
        join(mch[i].x, mch[i].y, mch[i].c);
    }

}
void dfs(int nod,int t)
{
    niv[nod] = niv[t] + 1;

    rmq[0][nod] = t;

    for (auto i : v[nod]) {
        if (i.first != t) {
            maxi[0][i.first] = i.second;
            dfs(i.first,nod);
        }
    }
}
int lca(int x, int y)
{
    int r = 0;
    if (niv[x] < niv[y]) {
        swap(x, y);
    }

    for(int i = 17;i >= 0 && niv[x] > niv[y]; i--) {
        if (rmq[i][x] !=0 && niv[rmq[i][x]] >= niv[y]) {
            r = max(r, maxi[i][x]);
            x = rmq[i][x];
        }
    }

    for(int i = 17; i>=0; i--) {
        if (rmq[i][x] != 0 && rmq[i][y] != 0 && rmq[i][x] != rmq[i][y]){
            r = max(r, max(maxi[i][y], maxi[i][x]));
            x = rmq[i][x];
            y = rmq[i][y];
        }
    }

    if (x != y) {
        r = max(r, max(maxi[0][x], maxi[0][y]));
    }
    return r;
}

int main()
{
    fin >> n >> m >> k;

    for(int i = 1; i <= n; i++) {
        t[i] = -1;
    }

    for(int i = 1; i <= m; i++) {
        fin >> mch[i].x >> mch[i].y >> mch[i].c;
    }

    apm();

    dfs(1, 0);

    for (int i = 1; (1 << i) <= n; i++) {
        for (int j = 1; j <= n; j++){
            rmq[i][j] = rmq[i - 1][rmq[i - 1][j]];
            maxi[i][j] = max(maxi[i - 1][rmq[i - 1][j]],maxi[i - 1][j]);
        }
    }

    while(k--) {
        fin >> x >> y;
        fout << lca(x,y) << '\n';
    }
    return 0;
}