Cod sursa(job #3327209)

Utilizator vladneaguVladneagu vladneagu Data 2 decembrie 2025 19:49:28
Problema Radiatie Scor 30
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.73 kb
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
const int maxn=15e3+5;
ifstream cin("radiatie.in");
ofstream cout("radiatie.out");
int p[maxn];
int sz[maxn];
int rsp[30005];
struct Edges {
    int l,r,cost;
    bool operator<(const Edges &e) const {
        return cost < e.cost;
    }
};
vector<Edges> edg;
struct query {
    int l,r,indi;
};
vector<query> q;
vector<query> nou;
int findd(int x) {
    if (x==p[x])return x;
    return p[x]=findd(p[x]);
}
void unite(int a,int b) {
    a=findd(a);
    b=findd(b);
    if (a==b)return;
    if (sz[a]<sz[b]) {
        p[a]=b;
        sz[b]+=sz[a];
    }else {
        p[b]=a;
        sz[a]+=sz[b];
    }
}
void solve() {
    int n,m,k;
    cin>>n>>m>>k;
    for (int i=1;i<=n;i++) {
        p[i]=i;
        sz[i]=1;
    }
    for (int i=1;i<=m;i++) {
        Edges e;
        cin>>e.l>>e.r>>e.cost;
        edg.push_back(e);
    }
    sort(edg.begin(),edg.end());
    for (int i=1;i<=k;i++) {
        query x;
        cin>>x.l>>x.r;
        x.indi=i;
        q.push_back(x);
    }
    for (int i=0;i<m;i++) {
        int cost=edg[i].cost;
        int j=i;
        while (cost==edg[j].cost && j<m) {
            int nod1=edg[j].l,nod2=edg[j].r,cost2=edg[j].cost;
            unite(nod1,nod2);
            j++;
        }
        i=j-1;
        for (auto qx:q) {
            int nod3=qx.l,nod4=qx.r,indi=qx.indi;
            if (findd(nod3)==findd(nod4)) {
                rsp[indi]=cost;
                //cout<<nod3<<" "<<nod4<<endl;
            }else nou.push_back(qx);
        }
        q=nou;
        nou.clear();
        if (q.size()==0)break;
    }
    for (int i=1;i<=k;i++) {
        cout<<rsp[i]<<"\n";
    }
}
signed main() {
    int t;
    t=1;
    while(t--)solve();
    return 0;
}