Cod sursa(job #3275258)

Utilizator AlexandruTigauTigau Alexandru AlexandruTigau Data 9 februarie 2025 16:01:19
Problema Radiatie Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.23 kb
#include <fstream>
#include <vector>
#include <algorithm>
#include <cmath>
using namespace std;
ifstream f("radiatie.in");
ofstream g("radiatie.out");
struct edge{
    int a,b,c;
};
vector<pair<int,int>> apm[15005];
vector<edge> edges;
int size[15005],rep[15005],lift[20][15005],minedge[20][15005],father[15005],level[15005];
bool compare(edge x, edge y)
{
    return x.c<y.c;
}
int find(int x)
{
    if(!rep[x])
        return x;
    return rep[x]=find(rep[x]);
}
void unionn(int x, int y)
{
    if(size[x]>size[y])
        swap(x,y);
    rep[x]=y, size[y]+=size[x];
}
void dfs(int x)
{
    for(auto i:apm[x])
        if(i.first!=father[x])
    {
        father[i.first]=lift[0][i.first]=x, minedge[0][i.first]=rep[i.first]=i.second;
        level[i.first]=level[x]+1;
        dfs(i.first);
    }
}
void get_ancestors(int x)
{
    int p=1;
    while(level[x]-(1<<p)>=0)
    {
        lift[p][x]=lift[p-1][lift[p-1][x]];
        minedge[p][x]=max(minedge[p-1][x],minedge[p-1][lift[p-1][x]]);
        p++;
    }
    for(auto i:apm[x])
        if(i.first!=father[x])
            get_ancestors(i.first);
}
int binary_lifting(int x, int y)
{
    int maxx=0;
    if(level[x]<level[y])
        swap(x,y);
    int lg=log2(level[x]+1);
    for(int i=lg;i>=0;i--)
        if(level[x]-(1<<i)>level[y])
    {
        maxx=max(maxx,minedge[i][x]);
        x=lift[i][x];
    }
    if(father[x]==y)
        return max(maxx,rep[x]);
    x=father[x];
    maxx=max(maxx,rep[x]);
    for(int i=lg;i>=0;i--)
    {
        if(lift[i][x]==0||lift[i][x]==lift[i][y])
            continue;
        maxx=max(maxx,max(minedge[i][x],minedge[i][y]));
        x=lift[i][x], y=lift[i][y];
    }
    return maxx;
}
int main()
{
    int n,m,k;
    f>>n>>m>>k;
    for(int i=1;i<=m;i++)
    {
        int a,b,c;
        f>>a>>b>>c;
        edges.push_back({a,b,c});
    }
    sort(edges.begin(),edges.end(),compare);
    for(int i=1;i<=n;i++)
        size[i]=1;
    for(auto i:edges)
    {
        int x=find(i.a), y=find(i.b);
        if(x==y)
            continue;
        apm[i.a].push_back({i.b,i.c});
        apm[i.b].push_back({i.a,i.c});
        unionn(x,y);
    }
    dfs(1);
    get_ancestors(1);
    while(k--)
    {
        int x,y;
        f>>x>>y;
        g<<binary_lifting(x,y)<<'\n';
    }
    return 0;
}