Cod sursa(job #3307373)

Utilizator mtcmtcmtc mtc mtcmtc Data 20 august 2025 15:31:30
Problema Radiatie Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.14 kb
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
ifstream cin("radiatie.in");
ofstream cout("radiatie.out");
const int maxn=15e3+5;
struct muchie{
    int a,b,c;
};
muchie M[maxn*2];
int tata[maxn],h[maxn];
vector<pair<int,int>>adj[maxn];
int root(int x){
    if(x==tata[x]) return x;
    else return tata[x]=root(tata[x]);
}
bool same_component(int x,int y){
    return root(x)==root(y);
}
void join(int x,int y){
    x=root(x);
    y=root(y);
    if(h[x]<h[y]) swap(x,y);
    if(h[x]==h[y]) h[x]++;
    tata[y]=x;
}
int n,m,k;
int t[maxn][15];
int mx[maxn][15];
int H[maxn];
void dfs(int ant,int nod){
    for(auto e:adj[nod]){
        int next=e.first,dist=e.second;
        if(next==ant) continue;
        t[next][0]=nod;
        mx[next][0]=dist;
        H[next]=H[nod]+1;
        for(int i=1;i<=14;i++){
            t[next][i]=t[t[next][i-1]][i-1];
            mx[next][i]=max(mx[t[next][i-1]][i-1],mx[next][i-1]);
        }
        dfs(nod,next);
    }
}
int query(int x,int y){
    if(H[x]<H[y]) swap(x,y);
    int dif=H[x]-H[y];
    int ans=0;
    for(int i=0;i<=14;i++){
        if(dif&(1<<i)){
            ans=max(ans,mx[x][i]);
            x=t[x][i];
        }
    }
    for(int i=14;i>=0;i--){
        if(t[x][i]!=t[y][i]){
            ans=max(ans,max(mx[x][i],mx[y][i]));
            x=t[x][i];
            y=t[y][i];
        }
    }
    return max(ans,max(mx[x][0],mx[y][0]));
}
int main()
{
    cin>>n>>m>>k;
    for(int i=1;i<=n;i++){
        tata[i]=i;
        h[i]=1;
    }
    for(int i=1;i<=m;i++){
        cin>>M[i].a>>M[i].b>>M[i].c;
    }
    sort(M+1,M+m+1,[](muchie a,muchie b){
        return a.c<b.c;
    });
    for(int i=1;i<=m;i++){
        int a=M[i].a,b=M[i].b,c=M[i].c;
        if(!same_component(a,b)){
            join(a,b);
            adj[a].push_back({b,c});
            adj[b].push_back({a,c});
        }
    }
    H[1]=0;
    for(int i=0;i<=14;i++){
        t[1][i]=0;
        mx[1][i]=0;
    }
    dfs(0,1);
    for(int i=1;i<=k;i++){
        int x,y;
        cin>>x>>y;
        cout<<query(x,y)<<'\n';
    }
    return 0;
}