Cod sursa(job #2849295)

Utilizator MocalinnoMoca Andrei Catalin Mocalinno Data 14 februarie 2022 20:26:41
Problema Radiatie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.23 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin("radiatie.in");
ofstream fout("radiatie.out");
const int LMAX(14), NMAX(15005), MMAX(30005);
int t[NMAX][LMAX], r[NMAX][LMAX], n, m, q, dad[NMAX], lvl[NMAX], l2[NMAX], p2[LMAX];
tuple<int, int, int> edges[MMAX];
vector<pair<int, int>> g[NMAX];
inline void DFS(int const& x = 1) {
    for (int i = 1; i < LMAX; ++i) {
        t[x][i] = t[t[x][i - 1]][i - 1];
        r[x][i] = max(r[x][i - 1], r[t[x][i - 1]][i - 1]);
    }
    for (pair<int, int> const& P : g[x]) {
        int y, w;
        tie(y, w) = P;
        if (y == t[x][0])
            continue;
        lvl[y] = lvl[x] + 1;
        t[y][0] = x;
        r[y][0] = w;
        DFS(y);
    }
}
inline int Query(int const& a, int const& b) {
    int x = a, y = b, res = 0;
    if (lvl[x] < lvl[y])
        swap(x, y);
    for (int i = l2[lvl[x] - lvl[y] + 1]; i >= 0; --i)
        if (lvl[x] - p2[i] >= lvl[y]) {
            res = max(res, r[x][i]);
            x = t[x][i];
        }
    if (x == y)
        return res;
    for (int i = l2[lvl[x]]; i >= 0; --i)
        if (t[x][i] != t[y][i]) {
            res = max({res, r[x][i], r[y][i]});
            x = t[x][i];
            y = t[y][i];
        }
    res = max({res, r[x][0], r[y][0]});
    return res;
}
inline int Find(int const& x) {
    if (x == dad[x]) return x;
    return dad[x] = Find(dad[x]);
}
int main() {
    for (int i = 2; i < NMAX; ++i)
        l2[i] = l2[i / 2] + 1;
    p2[0] = 1;
    for (int i = 1; i < LMAX; ++i)
        p2[i] = p2[i - 1] * 2;
    fin >> n >> m >> q;
    for (int i = 1; i <= m; ++i) {
        int x, y, w;
        fin >> x >> y >> w;
        edges[i] = make_tuple(w, x, y);
    }
    sort(edges + 1, edges + m + 1);
    for (int i = 1; i <= n; ++i)
        dad[i] = i;
    for (int i = 1; i <= m; ++i) {
        int x, y, w;
        tie(w, x, y) = edges[i];
        int rx = Find(x), ry = Find(y);
        if (rx == ry) continue;
        g[x].emplace_back(y, w);
        g[y].emplace_back(x, w);
        dad[rx] = ry;
    }
    DFS();
    while (q--) {
        int x, y;
        fin >> x >> y;
        fout << Query(x, y) << '\n';
    }
    fin.close();
    fout.close();
    return 0;
}