Cod sursa(job #3361387)

Utilizator Radu_BicliBiclineru Radu Radu_Bicli Data 23 iulie 2026 17:37:32
Problema Radiatie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.04 kb
#include <bits/stdc++.h>

using namespace std;

#define USE_STD_IO 0
#if USE_STD_IO
    #define fin cin
    #define fout cout
#else
    ifstream fin("radiatie.in");
    ofstream fout("radiatie.out");
#endif

struct Muchie {
    int vec, cost;
};
vector<Muchie> gr[15002];
int n,m, q, i, j;
int tata[15002], tRan[15002];
int niv[15002], lg[15002];

int jmp[18][15002];
int maJmp[18][15002];

vector<array<int, 3>> mch;

static inline void Swap(int& a, int& b) {
    if(a == b) return;
    a ^= b;
    b ^= a;
    a ^= b;
}

static inline int Tata(int a) {
    if(a == tata[a]) return a;
    return tata[a] = Tata(tata[a]);
}

int Unire_cost;
static inline bool Unire(int a, int b) {
    a = Tata(a);
    b = Tata(b);
    if(a == b) return false;
    if(tRan[a] < tRan[b]) Swap(a, b);

    if(tRan[a] == tRan[b]) tRan[a]++;
    tata[b] = a;
    gr[a].push_back({b, Unire_cost});
    gr[b].push_back({a, Unire_cost});
    return true;
}

static inline void DFS(int nod) {
    for(Muchie cur : gr[nod]) {
        if(0 == niv[cur.vec]) {
            niv[cur.vec] = niv[nod] + 1;
            jmp[0][cur.vec] = nod;
            maJmp[0][cur.vec] = cur.cost;
            DFS(cur.vec);
        }
    }
}


int main() {
    #if USE_STD_IO
        ios_base::sync_with_stdio(false);
    #endif
    fin.tie(NULL);
    fout.tie(NULL);

    fin >> n >> m >> q;
    for(i = 1; i <= m; i++) {
        int x, y, c;
        fin >> x >> y >> c;
        mch.push_back({c, x, y});
    }

    for(i = 1; i <= n; i++) {
        tata[i] = i;
        tRan[i] = 1;
    }
    sort(mch.begin(), mch.end());

    for(const array<int, 3>& cur : mch) {
        Unire_cost = cur[0];
        Unire(cur[1], cur[2]);
    }

    DFS(1);

    for(i = 2; i <= n; i++) lg[i] = 1 + lg[i >> 1];

    for(i = 1; i <= lg[n]; i++) {
        for(j = 1; j <= n; j++) {
            jmp[i][j] = jmp[i - 1][jmp[i - 1][j]];
            maJmp[i][j] = max(maJmp[i - 1][j], maJmp[i - 1][jmp[i - 1][j]]);
        }
    }

    while(0 < q--) {
        int x, y;
        fin >> x >> y;
        if(x == y) {
            fout << "0\n";
            continue;
        }

        int nx = niv[x], ny = niv[y];
        if(nx < ny) {
            Swap(x, y);
            Swap(nx, ny);
        }

        int dif = nx - ny;
        int ma = 0;

        while(0 < dif) {
            int k = lg[dif];
            ma = max(ma, maJmp[k][x]);
            x = jmp[k][x];
            dif = niv[x] - ny;
        }

        if(x == y) {
            fout << ma << '\n';
            continue;
        }

        for(i = lg[n]; 0 <= i; i--) {
            if(0 != jmp[i][x] && jmp[i][x] != jmp[i][y]) {
                if(ma < maJmp[i][x]) ma = maJmp[i][x];
                if(ma < maJmp[i][y]) ma = maJmp[i][y];
                x = jmp[i][x];
                y = jmp[i][y];
            }
        }

        if(ma < maJmp[0][x]) ma = maJmp[0][x];
        if(ma < maJmp[0][y]) ma = maJmp[0][y];
        fout << ma << '\n';
    }

    return 0;
}