Cod sursa(job #3352818)

Utilizator xDemonstyMatei Haba Ionut xDemonsty Data 1 mai 2026 20:02:33
Problema Radiatie Scor 50
Compilator cpp-64 Status done
Runda cerc-acs-02-05-26 Marime 2.68 kb
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
ifstream fin("radiatie.in");
ofstream fout("radiatie.out");
#pragma GCC target ("avx2")
#pragma GCC optimize ("O3")
#pragma GCC optimize ("unroll-loops")
using ll=long long;
const ll mod=998244353;
const int N=15001;
int n,k,m,rad[N*3];
ll mx[3*N],binlift[N*3][21];
int nodes,height[N];
vector<int>adj[N];
int get(int x)
{
    int aux=x;
    while(rad[aux]>0)
        aux=rad[aux];
    while(rad[x]>0)
    {
        int taux=rad[x];
        rad[x]=aux;
        x=taux;
    }
    return x;
}
void unite(int a,int b,ll scor)
{
    nodes++;
    rad[nodes]+=rad[a];
    rad[nodes]+=rad[b];
    rad[a]=nodes;
    rad[b]=nodes;
    adj[a].push_back(nodes);
    adj[b].push_back(nodes);
    adj[nodes].push_back(a);
    adj[nodes].push_back(b);
    mx[nodes]=scor;
}
void dfs(int nod,int p)
{
    height[nod]=height[p]+1;
    binlift[nod][0]=p;
    for(int k=1;k<=14;k++)
    {
        binlift[nod][k]=binlift[binlift[nod][k-1]][k-1];
        if(binlift[nod][k]==0)
            break;
    }
    for(auto u:adj[nod])
    {
        if(u!=p)
            dfs(u,nod);
    }
}
int get_lca(int a,int b) {
    if (height[a] > height[b])
        swap(a, b);
    for (int k = 14; k >= 0; k--) {
        if (height[binlift[b][k]] >= height[a])
            b = binlift[b][k];
    }

    if(a==b)
        return a;
    for(int k=14;k>=0;k--)
    {
        if(binlift[a][k]!=binlift[b][k])
        {
            a=binlift[a][k];
            b=binlift[b][k];
        }
    }
    return binlift[a][0];
}
struct trio
{
    ll a,b,c;
    bool operator<(const trio &other)const
    {
        return c<other.c;
    }
};
void solve()
{
    fin>>n>>m>>k;
    nodes=n;
    //fout<<n<<'\n';
    for(int i=1;i<=n;i++)
        rad[i]=-1;
    vector<trio>muchii;
    for(int i=1;i<=m;i++)
    {
        int a,b;
        fin>>a>>b;
        ll cost;
        fin>>cost;
        muchii.push_back({a,b,cost});
    }
    sort(muchii.begin(),muchii.end());
    for(auto [x,y,k]:muchii)
    {
        int a=get(x);
        int b=get(y);
        //fout<<a<<" "<<b<<" "<<x<<" "<<y<<'\n';
        if(a!=b)
            unite(a,b,k);
    }
    //return;
    dfs(nodes,0);
    //fout<<k<<'\n';
    for(int i=1;i<=k;i++)
    {
        int a,b;
        fin>>a>>b;
        int x=get_lca(a,b);
      //  fout<<x<<" "<<i<<'\n';
        fout<<mx[x]<<'\n';
    }
}
int main()
{
    ios::sync_with_stdio(0);
    fin.tie(0);
    fout.tie(0);
    int test=1;
    if(!fin.is_open())
    {
        fout<<"hell";
        return 0;
    }
    while(test--)
        solve();

    return 0;

}