Cod sursa(job #3307644)

Utilizator horatiu.avramAvram Popa Cristian Horatiu horatiu.avram Data 22 august 2025 13:55:52
Problema Radiatie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.45 kb
#include<bits/stdc++.h>
using namespace std;
typedef struct {
    int u,v,cost;
} edge;
typedef struct {
    int nd,cost;
} adj_elt;
const int MAXM=3e4;
const int MAXN=MAXM/2;
const int MAXLOG=20;
edge edges[MAXM+1];
int pr[MAXN+1],up[MAXLOG+1][MAXN+1],c[MAXLOG+1][MAXN+1],lvl[MAXN+1],sz[MAXN+1];
vector<adj_elt>apm_adj[MAXN+1];
bool cmp(edge a,edge b) {
    return a.cost<b.cost;
}
int _find(int u) {
    if(u==pr[u]) {
        return u;
    }
    return pr[u]=_find(pr[u]);
}
bool connected(int u,int v) {
    u=_find(u);
    v=_find(v);
    return (u==v);
}
void unite(int u,int v) {
    u=_find(u);
    v=_find(v);
    if(u!=v) {
        if(sz[u]>sz[v]) {
            sz[u]+=sz[v];
            pr[v]=u;
        } else {
            sz[v]+=sz[u];
            pr[u]=v;
        }
    }
}
void dfs(int u,int fa=0,int co=0) {
    up[0][u]=fa;
    c[0][u]=co;
    lvl[u]=1+lvl[fa];
    for(auto v:apm_adj[u]) {
        if(v.nd!=fa) {
            dfs(v.nd,u,v.cost);
        }
    }
}
int query(int u,int v) {
    int delta=abs(lvl[u]-lvl[v]);
    if(lvl[u]<lvl[v]) {
        swap(u,v);
    }
    int e=0;
    for(int i=MAXLOG; i>=0; i--) {
        if((delta>>i)&1) {
            e=max(e,c[i][u]);
            u=up[i][u];
        }
    }
    if(u==v) {
        return e;
    }
    for(int i=MAXLOG; i>=0; i--) {
        if(up[i][u]!=0&&up[i][v]!=0&&up[i][u]!=up[i][v]) {
            e=max(e,max(c[i][u],c[i][v]));
            u=up[i][u];
            v=up[i][v];
        }
    }
    e=max(e,max(c[0][u],c[0][v]));
    return e;
}
ifstream fin("radiatie.in");
ofstream fout("radiatie.out");
int main() {
    int n,m,k;
    fin>>n>>m>>k;
    for(int i=0; i<m; i++) {
        fin>>edges[i].u>>edges[i].v>>edges[i].cost;
    }
    sort(edges,edges+m,cmp);
    for(int i=1; i<=n; i++) {
        pr[i]=i;
        sz[i]=1;
    }
    for(int i=0; i<m; i++) {
        if(!connected(edges[i].u,edges[i].v)) {
            unite(edges[i].u,edges[i].v);
            apm_adj[edges[i].v].push_back({edges[i].u,edges[i].cost});
            apm_adj[edges[i].u].push_back({edges[i].v,edges[i].cost});
        }
    }
    dfs(1);
    for(int i=1; i<=MAXLOG; i++) {
        for(int j=1; j<=n; j++) {
            up[i][j]=up[i-1][up[i-1][j]];
            c[i][j]=max(c[i-1][j],c[i-1][up[i-1][j]]);
        }
    }
    while(k--) {
        int u,v;
        fin>>u>>v;
        fout<<query(u,v)<<'\n';
    }
    return 0;
}