Cod sursa(job #3287574)

Utilizator Dia3141Costea Diana Stefania Dia3141 Data 18 martie 2025 17:01:16
Problema Radiatie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.96 kb
#include <fstream>
#include <algorithm>
#include <vector>
#define nmax 15005
using namespace std;
ifstream cin("radiatie.in");
ofstream cout("radiatie.out");
int n,m,k,x,y,c,t[nmax],rmq[18][nmax],maxi[18][nmax],niv[nmax];
struct elem{
    int x,y,c;
}mch[nmax*2];
vector<pair<int,int>>v[nmax];
bool cmp(const elem& a,const elem& b){
    return a.c<b.c;
}
int get_root(int x){
    if(t[x]>0)
        return get_root(t[x]);
    return x;
}
void join(int x,int y,int c){
    int rx=get_root(x),ry=get_root(y);
    if(rx==ry)
        return ;
    v[x].push_back({y,c});
    v[y].push_back({x,c});
    if(t[rx]>t[ry])
        swap(rx,ry);
    t[rx]+=t[ry];
    t[ry]=rx;
}
void apm(){
    sort(mch+1,mch+m+1,cmp);
    for(int i=1;i<=m;i++)
        join(mch[i].x,mch[i].y,mch[i].c);
}
void dfs(int nod,int t){
    niv[nod]=niv[t]+1;
    rmq[0][nod]=t;
    for(auto i:v[nod])
        if(i.first!=t){
            maxi[0][i.first]=i.second;
            dfs(i.first,nod);
        }
}
int lca(int x,int y){
    int r=0;
    if(niv[x]<niv[y])
        swap(x,y);
    for(int i=17;i>=0&&niv[x]>niv[y];i--)
        if(rmq[i][x]!=0&&niv[rmq[i][x]]>=niv[y]){
            r=max(r,maxi[i][x]);
            x=rmq[i][x];
        }
    for(int i=17;i>=0;i--)
        if(rmq[i][x]!=0&&rmq[i][y]!=0&&rmq[i][x]!=rmq[i][y]){
            r=max(r,max(maxi[i][y],maxi[i][x]));
            x=rmq[i][x];
            y=rmq[i][y];
        }
    if(x!=y)
        r=max(r,max(maxi[0][x],maxi[0][y]));
    return r;
}
int main()
{
    cin>>n>>m>>k;
    for(int i=1;i<=n;i++)
        t[i]=-1;
    for(int i=1;i<=m;i++)
        cin>>mch[i].x>>mch[i].y>>mch[i].c;
    apm();
    dfs(1,0);
    for(int i=1;(1<<i)<=n;i++)
        for(int j=1;j<=n;j++){
            rmq[i][j]=rmq[i-1][rmq[i-1][j]];
            maxi[i][j]=max(maxi[i-1][rmq[i-1][j]],maxi[i-1][j]);
        }
    while(k--){
        cin>>x>>y;
        cout<<lca(x,y)<<'\n';
    }
    return 0;
}