Cod sursa(job #3331982)

Utilizator coco11coraline kalbfleisch coco11 Data 2 ianuarie 2026 15:41:10
Problema Radiatie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.75 kb
#include <bits/stdc++.h>
using namespace std;

struct Edge{int a,b;int w;};
struct DSU{
    vector<int> p,r;
    DSU(int n):p(n+1),r(n+1,0){iota(p.begin(),p.end(),0);}
    int find(int x){return p[x]==x?x:p[x]=find(p[x]);}
    bool unite(int a,int b){
        a=find(a);b=find(b);
        if(a==b) return false;
        if(r[a]<r[b]) swap(a,b);
        p[b]=a;
        if(r[a]==r[b]) r[a]++;
        return true;
    }
};

int main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    // File redirection
    freopen("radiatie.in","r",stdin);
    freopen("radiatie.out","w",stdout);

    int N,M,K;
    cin>>N>>M>>K;
    vector<Edge> edges(M);
    for(int i=0;i<M;i++) cin>>edges[i].a>>edges[i].b>>edges[i].w;

    vector<vector<pair<int,int>>> g(N+1);
    DSU dsu(N);
    sort(edges.begin(),edges.end(),[](const Edge& x,const Edge& y){return x.w<y.w;});
    for(auto &e:edges){
        if(dsu.unite(e.a,e.b)){
            g[e.a].push_back({e.b,e.w});
            g[e.b].push_back({e.a,e.w});
        }
    }

    int LOG=1;
    while((1<<LOG)<=N) LOG++;
    vector<vector<int>> up(LOG, vector<int>(N+1,0));
    vector<vector<int>> mx(LOG, vector<int>(N+1,0));
    vector<int> depth(N+1,0), vis(N+1,0);

    for(int s=1;s<=N;s++){
        if(vis[s]) continue;
        vis[s]=1;
        depth[s]=0;
        up[0][s]=s;
        mx[0][s]=0;
        stack<int> st;
        st.push(s);
        while(!st.empty()){
            int u=st.top(); st.pop();
            for(auto &pr:g[u]){
                int v=pr.first,w=pr.second;
                if(v==up[0][u]) continue;
                if(vis[v]) continue;
                vis[v]=1;
                up[0][v]=u;
                mx[0][v]=w;
                depth[v]=depth[u]+1;
                st.push(v);
            }
        }
    }

    for(int j=1;j<LOG;j++){
        for(int i=1;i<=N;i++){
            up[j][i]=up[j-1][ up[j-1][i] ];
            mx[j][i]=max(mx[j-1][i], mx[j-1][ up[j-1][i] ]);
        }
    }

    auto query=[&](int a,int b){
        int ans=0;
        if(depth[a]<depth[b]) swap(a,b);
        int diff=depth[a]-depth[b];
        for(int j=0;j<LOG;j++){
            if(diff&(1<<j)){
                ans=max(ans,mx[j][a]);
                a=up[j][a];
            }
        }
        if(a==b) return ans;
        for(int j=LOG-1;j>=0;j--){
            if(up[j][a]!=up[j][b]){
                ans=max(ans,mx[j][a]);
                ans=max(ans,mx[j][b]);
                a=up[j][a];
                b=up[j][b];
            }
        }
        ans=max(ans,mx[0][a]);
        ans=max(ans,mx[0][b]);
        return ans;
    };

    for(int i=0;i<K;i++){
        int x,y;cin>>x>>y;
        cout<<query(x,y)<<"\n";
    }
    return 0;
}