Cod sursa(job #3005295)

Utilizator pifaDumitru Andrei Denis pifa Data 16 martie 2023 21:03:05
Problema Radiatie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.45 kb
#include <bits/stdc++.h>
#define int long long
using namespace std;

ifstream in("radiatie.in");
ofstream out("radiatie.out");

const int N = 30005;

const int LOG = 14;

int n, m, q;

int sef[N], nivel[N];

struct k
{
    int x, y, z;
};

k v[N];

int sz[N];

int cmp(k a, k b)
{
    return a.z < b.z;
}

vector <pair <int, int>> g[N];

int find(int nod)
{
    if(nod == sef[nod])
        return nod;
    return sef[nod] = find(sef[nod]);
}

int up[N][LOG], maxi[N][LOG];

void dfs(int nod)
{
    for (auto it: g[nod])
    {
        nivel[it.first] = nivel[nod] + 1;
        up[it.first][0] = nod;
        for (int i = 1; i < LOG; ++i)
            up[it.first][i] = up[up[it.first][i - 1]][i - 1];
        maxi[it.first][0] = it.second;
        for (int i = 1; i < LOG; ++i)
            maxi[it.first][i] = max(maxi[it.first][i - 1], maxi[up[it.first][i - 1]][i - 1]);
        dfs(it.first);
    }
}

int lca(int a, int b)
{
    if(nivel[a] > nivel[b])
        swap(a, b);
    int diff = nivel[b] - nivel[a], ans = 0;
    for(int i = 0; i < LOG; i++)
    {
        if(diff & (1 << i))
        {
            ans = max(ans, maxi[b][i]);
            b = up[b][i];
        }
    }
    if(a == b)
        return ans;
    for(int i = LOG - 1; i >= 0; i--)
    {
        if(up[a][i] != up[b][i])
        {
            ans = max(ans, max(maxi[a][i], maxi[b][i]));
            a = up[a][i];
            b = up[b][i];
        }
    }
    ans = max(ans, max(maxi[a][0], maxi[b][0]));
    return ans;
}

signed main()
{
    in >> n >> m >> q;
    for(int i = 1; i <= m; i++)
    {
        in >> v[i].x >> v[i].y>> v[i].z;
    }
    sort(v + 1, v + m + 1, cmp);
    for(int i = 1; i <= n; i++)
    {
        sef[i] = i;
        sz[i] = 1;
    }
    for(int i = 1; i <= m; i++)
    {
        int a = find(v[i].x), b = find(v[i].y);
        if(a != b)
        {
            if(sz[a] < sz[b])
            {
                sef[a] = b;
                sz[b] += sz[a];
                g[b].push_back({a, v[i].z});
            }
            else
            {
                sef[b] = a;
                sz[a] += sz[b];
                g[a].push_back({b, v[i].z});
            }
        }
    }

    for(int i = 1; i <= n; i++)
    {
        if(sef[i] == i)
            dfs(i);
    }
    while(q--)
    {
        int x, y;
        in >> x >> y;
        out << lca(x, y) << '\n';
    }
    return 0;
}