Cod sursa(job #3037936)

Utilizator begusMihnea begus Data 26 martie 2023 18:04:38
Problema Radiatie Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.5 kb
#include <bits/stdc++.h>
using namespace std;

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

#define f first
#define sn second

const int NMAX=15001;
const int LOG=16;

priority_queue<tuple<int, int, int>> edges;
vector<pair<int, int>> children[NMAX];
int n, m, k, link[NMAX], sz[NMAX], up[NMAX][LOG], upmin[NMAX][LOG], depth[NMAX];

int find(int x){
    while (x!=link[x]) x=link[x];
    return x;
}

void unite(int a, int b){
    a = find(a);
    b = find(b);
    if (sz[a]<sz[b]) swap(a,b);
    sz[a]+=sz[b];
    link[b]=a;
}

void buildTree(){
    while(!edges.empty()){
        int w, a, b;
        tie(w, a, b)=edges.top(); edges.pop(); 
        if(find(a)!=find(b)){
            unite(a, b);
            if(a>b) swap(a, b);
            children[a].push_back({b, -w});
        }
    }
}

void dfs(int s){
    for(auto u : children[s]){
        depth[u.f]=depth[s]+1;
        up[u.f][0]=s;
        upmin[u.f][0]=u.sn;
        for(int j=1; j<LOG; j++){
            up[u.f][j]=up[up[u.f][j-1]][j-1];
            upmin[u.f][j]=max(upmin[u.f][j-1], upmin[up[u.f][j-1]][j-1]);
        }
        dfs(u.f);
    }
}

int lca(int a, int b){
    if(a==b) return 0;
    int minrad=INT_MIN;
    if(depth[a]<depth[b]) swap(a, b);
    int d = depth[a]-depth[b];
    for(int j=LOG-1; j>=0; j--){
        if(d & (1<<j)){
            minrad=max(minrad, upmin[a][j]);
            a=up[a][j];
        }    
    }
    if(a==b) return minrad;
    for(int j=LOG-1; j>=0; j--){
        if(up[a][j]!=up[b][j]){
            minrad=max(max(upmin[a][j], upmin[b][j]), minrad);
            a=up[a][j];
            b=up[b][j];
        }
    }
    return max(max(upmin[a][0], upmin[b][0]), minrad);
}

int main(){
    fin >> n >> m >> k;
    for(int i=1; i<=n; i++){
        link[i]=i;
        sz[i]=1;
    } 
    while(m--){
        int a, b, w;
        fin >> a >> b >> w;
        edges.push({-w, a, b});
    }
    buildTree();
    for(int j=0; j<LOG; j++){
        up[1][j]=1;
        upmin[1][j]=INT_MIN;
    } 
    dfs(1);
    // for(int i=1; i<=n; i++){
    //     for(int j=0; j<LOG; j++){
    //         fout << up[i][j] << ' ';
    //     }
    //     fout << '\n';
    // }
    // fout << '\n';
    // for(int i=1; i<=n; i++){
    //     for(int j=0; j<LOG; j++){
    //         fout << upmin[i][j] << ' ';
    //     }
    //     fout << '\n';
    // }
    while(k--){
        int a, b;
        fin >> a >> b;
        fout << lca(a, b) << '\n';
    }
}