Cod sursa(job #3328317)

Utilizator Grama2008Grama Andrei Teodor Grama2008 Data 7 decembrie 2025 18:15:38
Problema Radiatie Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.21 kb
#include <bits/stdc++.h>

using namespace std;

const int N=15005, M=30005, K=14;
tuple<int,int,int>edges[M];
vector<pair<int,int>>adj[N];
int sz[N], parent[N], p[N], height[N];
pair<int,int>bin[K][N], queries[N];

int getparent(int x){
    if (parent[x]==x){
        return x;
    }
    return parent[x]=getparent(parent[x]);
}

void unite(int a, int b){
    a=getparent(a);
    b=getparent(b);
    if (sz[b]>sz[a]){
        swap(a,b);
    }
    parent[b]=a;
    sz[a]+=sz[b];
}

int lca(int a, int b){
    int ans=0;
    if (height[a]!=height[b]){
        if (height[a]<height[b]){
            swap(a,b);
        }
        int k=height[a]-height[b];
        while (k){
            int i=__builtin_ctz(k);
            ans=max(ans, bin[i][a].second);
            a=bin[i][a].first;
            k&=(k-1);
        }
    }
    for (int i=K-1;i>=0;i--){
        if (bin[i][a].first!=bin[i][b].first){
            ans=max(ans, bin[i][a].second);
            ans=max(ans, bin[i][b].second);
            a=bin[i][a].first;
            b=bin[i][b].first;
        }
    }
    return ans;
}

void dfs(int i, int parentofi, int h){
    height[i]=h;
    for (auto [x,w]:adj[i])if (x!=parentofi){
        bin[0][x]={i,w};
        dfs(x,i,h+1);
    }
}


int main()
{
    freopen("radiatie.in", "r", stdin);
    freopen("radiatie.out", "w", stdout);
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int n,m,k;cin>>n>>m>>k;
    for (int i=1;i<=n;i++){
        sz[i]=1;
        parent[i]=i;
    }
    for (int i=0;i<m;i++){
        int u,v,w;cin>>u>>v>>w;
        edges[i]={w,u,v};
    }
    sort(edges, edges+m);
    for (int i=0;i<m;i++){
        auto [w,u,v]=edges[i];
        if (getparent(u)!=getparent(v)){
            unite(u,v);
            adj[u].push_back({v,w});
            adj[v].push_back({u,w});
        }
    }
    for (int idx=0;idx<k;idx++){
        int a,b;cin>>a>>b;
        if (idx==0){
            dfs(a,0,0);
            for (int i=1;i<K;i++){
                for (int j=1;j<=n;j++){
                    bin[i][j].first=bin[i-1][bin[i-1][j].first].first;
                    bin[i][j].second=max(bin[i-1][j].second, bin[i-1][bin[i-1][j].first].second);
                }
            }
        }
        cout<<lca(a,b)<<'\n';
    }
    return 0;
}