Cod sursa(job #3336561)

Utilizator Dragos__1_1Dragos Antohi Dragos__1_1 Data 24 ianuarie 2026 21:55:51
Problema Radiatie Scor 30
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.55 kb
#include <bits/stdc++.h>
#define tu tuple<int,int,int>
#define pi pair<int,int>
using namespace std;
ifstream f("radiatie.in");
ofstream g("radiatie.out");
int t,n,m,i,j,a,b,c,q,parent[20005],sz[20005],lca[20005][16];
int mx[20005][16],level[20005];
vector<pi>v[20005];
priority_queue<tu,vector<tu>,greater<tu>>PQ;
void init(int node){
    parent[node]=node;
    sz[node]=1;
}
int father(int node){
    if(node==parent[node])return node;
    return parent[node]=father(parent[node]);
}
void unite(int a,int b){
    int x=father(a);
    int y=father(b);
    if (sz[x]<sz[y]){
        parent[x]=y;
        sz[y]+=x;
    }
    else {
        parent[y]=x;
        sz[x]+=y;
    }
}
void dfs(int node,int tta){
    for (auto it : v[node]){
        int a,b;
        tie(a,b)=it;
        if (b==tta){
            continue;
        }
        else{
            lca[b][0]=node;
            mx[b][0]=a;
            level[b]=level[node]+1;
            dfs(b,node);
        }
    }
}
void ans(int a,int b){
    if (a==b){cout<<0<<'\n';return;}
    if (level[a]>level[b])swap(a,b);
    int ansa=0,ansb=0;
    int k=(1<<15),cnt=15;
    while(level[a]!=level[b]){
        int hw=level[b]-level[a];
        //cout<<"!!!!"<<level[a]<<' '<<level[b]<<'\n';
        if (hw>=k){
            ansb=max(ansb,mx[b][cnt]);
            b=lca[b][cnt];
        }
        k>>=1;
        cnt--;
    }

    k=(1<<15);cnt=15;
    while(k){
        if (lca[a][cnt]!=lca[b][cnt]){
            ansa=max(ansa,mx[a][cnt]);
            ansb=max(ansb,mx[b][cnt]);
            b=lca[b][cnt];
            a=lca[a][cnt];
        }
        k>>=1;
        cnt--;
    }
    ansa=max(ansa,parent[a]);
    ansb=max(ansb,parent[b]);
    g<<max(ansa,ansb)<<'\n';
}
int main()
{   f>>n>>m>>q;
    for (i=1;i<=m;i++){
        f>>a>>b>>c;
        PQ.push(make_tuple(c,a,b));
    }
    for (i=1;i<=n;i++){
        init(i);
    }
    while(!PQ.empty()){
        tie (c,a,b)=PQ.top();
        PQ.pop();
        if (father(a)!=father(b)){
            unite(father(a),father(b));
            //cout<<a<<' '<<b<<'\n';
            v[a].push_back({c,b});
            v[b].push_back({c,a});
        }
    }
    lca[1][0]=0;
    level[1]=1;
    dfs(1,0);
    for (i=1;i<=15;i++){
        for (j=1;j<=n;j++){
            lca[j][i]=lca[lca[j][i-1]][i-1];
            mx[j][i]=max(mx[j][i-1],mx[lca[j][i-1]][i-1]);
        }
    }
    //cout<<level[4]<<mx[4][1]<<' '<<lca[4][2]<<"!!!\n";
    for (i=1;i<=q;i++){
        f>>a>>b;
        ans(a,b);
    }
    return 0;
}