Cod sursa(job #3352938)

Utilizator ArseniuVictorStefanArseniu Victor Stefan ArseniuVictorStefan Data 2 mai 2026 15:34:23
Problema Radiatie Scor 100
Compilator cpp-64 Status done
Runda cerc-acs-02-05-26 Marime 1.52 kb
#include <bits/stdc++.h>

#define NMAX 30000
#define MMAX 30000
#define KMAX 15000

using namespace std;

struct edge_t {
  int u, v, w;
};

int n, m, k, parent[NMAX], sz[NMAX];
edge_t edges[MMAX];

unordered_set<int> queries[KMAX];
int ans[KMAX];

int get_root(int u) {
  if (u == parent[u]) {
    return u;
  }

  return parent[u] = get_root(parent[u]);
}

void merge_queries(unordered_set<int> &lhs, unordered_set<int> &rhs, int w) {
  if (lhs.size() < rhs.size()) {
    swap(lhs, rhs);
  }

  for (int i : rhs) {
    if (lhs.find(i) != lhs.end()) {
      ans[i] = w;
      lhs.erase(i);
    } else {
      lhs.insert(i);
    }
  }
}

void merge(int u, int v, int w) {
  if (sz[u] < sz[v]) {
    swap(u, v);
  }

  parent[v] = u;
  sz[u] += sz[v];

  merge_queries(queries[u], queries[v], w);
}

int main() {
  ifstream cin("radiatie.in");
  ofstream cout("radiatie.out");

  cin >> n >> m >> k;
  for (int i = 0; i < n; i++) {
    parent[i] = i;
    sz[i] = 1;
  }

  for (int i = 0; i < m; i++) {
    int u, v, w;
    cin >> u >> v >> w;
    u--, v--;

    edges[i] = {u, v, w};
  }

  for (int i = 0; i < k; i++) {
    int x, y;
    cin >> x >> y;
    x--, y--;

    queries[x].insert(i);
    queries[y].insert(i);
  }

  sort(edges, edges + m,
       [](const auto &e1, const auto &e2) { return e1.w < e2.w; });

  for (int i = 0; i < m; i++) {
    auto [u, v, w] = edges[i];

    u = get_root(u);
    v = get_root(v);

    if (u != v) {
      merge(u, v, w);
    }
  }

  for (int i = 0; i < k; i++) {
    cout << ans[i] << "\n";
  }
  return 0;
}