Cod sursa(job #3327185)

Utilizator mariusharabariMarius Harabari mariusharabari Data 2 decembrie 2025 17:52:00
Problema Radiatie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.69 kb
#include <bits/stdc++.h>
using namespace std;

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

struct muchie{
    int a, b, c;
}l[30002];

bool comp(muchie a, muchie b){
    return a.c<b.c;
}

const int NMAX=15e3+5, EMAX=17;
int n, m, k, ans=0;
int p[NMAX], lvl[NMAX], anc[EMAX][NMAX], maxl[EMAX][NMAX], lg[NMAX];
vector <pair <int,int>> g[NMAX];

int find_parent(int x){
    if(p[x]==x) return x;
    return p[x]=find_parent(p[x]);
}

void dfs(int nod, int h){
    lvl[nod]=h;
    for(auto vec : g[nod]){
        if(vec.first!=anc[0][nod]){
            anc[0][vec.first]=nod;
            maxl[0][vec.first]=vec.second;
            dfs(vec.first, h+1);
        }
    }
}

int par(int nod, int ord){
    int e=0;
    while(ord){
        if(ord%2){
            ans=max(ans, maxl[e][nod]);
            nod=anc[e][nod];
        }
        ord/=2;
        e++;
    }
    return nod;
}

void lca(int x, int y){
    int e=lg[lvl[x]];
    while(e>=0){
        if(anc[e][x]!=anc[e][y]){
            ans=max(ans, maxl[e][x]);
            ans=max(ans, maxl[e][y]);
            x=anc[e][x];
            y=anc[e][y];
            //cout<<e<<' '<<x<<' '<<y<<' '<<ans;
        }
        e--;
    }
    ans=max(ans, maxl[0][x]);
    ans=max(ans, maxl[0][y]);
}

int main(){
    fin>>n>>m>>k;
    for(int i=0;i<m;i++)
        fin>>l[i].a>>l[i].b>>l[i].c;

    sort(l, l+m, comp);

    //kruskal
    for(int i=1;i<=n;i++){
        p[i]=i;
    }

    for(int i=0;i<m;i++){
        int px=find_parent(l[i].a), py=find_parent(l[i].b);
        if(px!=py){
            p[py]=px;
            g[l[i].a].push_back({l[i].b, l[i].c});
            g[l[i].b].push_back({l[i].a, l[i].c});
        }
    }

    /*for(int i=1;i<=n;i++){
        cout<<i<<endl;
        for(auto vec : g[i]){
            cout<<vec.first<<' ';
        }
        cout<<endl;
    }*/

    dfs(1, 1);

    for(int i=1;i<=n;i++){
        lg[i]=lg[i/2]+1;
        //cout<<i<<' '<<anc[0][i]<<' '<<maxl[0][i]<<endl;
    }

    for(int e=1; e<=lg[n];e++){
        //cout<<e<<endl;
        for(int i=1;i<=n;i++){
            anc[e][i]=anc[e-1][anc[e-1][i]];
            maxl[e][i]=max(maxl[e-1][i], maxl[e-1][anc[e-1][i]]);
            //cout<<i<<' '<<anc[e][i]<<' '<<maxl[e][i]<<endl;
        }
    }

    while(k--){
        int x, y;
        ans=0;
        fin>>x>>y;

        if(lvl[x]>lvl[y])
            swap(x, y);
        y=par(y, lvl[y]-lvl[x]);

        //cout<<x<<' '<<lvl[x]<<' '<<y<<' '<<lvl[y]<<endl;
        if(x==y){
            fout<<ans<<'\n';
        }
        else{
            lca(x, y);
            fout<<ans<<'\n';
        }
    }

    return 0;
}