Cod sursa(job #3313807)

Utilizator Iustin_Mircea2010Iustin Mircea Iustin_Mircea2010 Data 6 octombrie 2025 19:40:36
Problema Radiatie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.67 kb
#include <bits/stdc++.h>

using namespace std;

struct edge {
    int u, v, w;
    bool operator<(const edge& e) const {
        return w < e.w;
    }
}e[30005];

struct DSU {
    int p[15005], siz[15005];
    DSU (int n) {
        for (int i = 1; i <= n; i++) {
            p[i] = i;
            siz[i] = 1;
        }
    }
    int find(int u) {
        if (u == p[u]) return u;
        return p[u] = find(p[u]);
    }
    void unite(int u, int v) {
        u = find(u);
        v = find(v);
        if (u == v) return;
        if (siz[u] > siz[v]) swap(u, v);
        p[u] = v;
        siz[v] += siz[u];
    }
};

struct query {
    int u, v, ind, ans;
};
vector<query> q;

vector<int> adj[15005];
int fin_ans[15005];

void modif(int b, int k, int m, int n) {
    DSU dsu(n);
    for (auto &key : q) {
        key.ans += b;
    }
    int poz = 0;
    vector<query> q1, q2; //q1 sunt cu += b, q2 sunt fara
    for (int i = 1; i <= m; i++) {
        dsu.unite(e[i].u, e[i].v);
        while (poz < k && q[poz].ans == i) {
            if (dsu.find(q[poz].u) == dsu.find(q[poz].v)) {
                q[poz].ans -= b;
                q2.push_back(q[poz]);
            }
            else
                q1.push_back(q[poz]);
            poz++;
        }
    }
    while (poz < k) {
        q[poz].ans -= b;
        q2.push_back(q[poz]);
        poz++;
    }
    //interclasarea
    int p1 = 0, p2 = 0;
    while (p1 != q1.size() || p2 != q2.size()) {
        if (p1 == q1.size()) {
            q[p1 + p2] = q2[p2];
            p2++;
        }
        else if (p2 == q2.size()) {
            q[p1 + p2] = q1[p1];
            p1++;
        }
        else {
            if (q1[p1].ans < q2[p2].ans) {
                q[p1 + p2] = q1[p1];
                p1++;
            }
            else {
                q[p1 + p2] = q2[p2];
                p2++;
            }
        }
    }
}

int main() {

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

    int n, m, k;
    cin >> n >> m >> k;
    for (int i = 1; i <= m; i++) {
        cin >> e[i].u >> e[i].v >> e[i].w;
    }
    sort(e + 1, e + m + 1);
    for (int i = 1; i <= k; i++) {
        int u, v;
        cin >> u >> v;
        q.push_back({u, v, i, 0});
    }
    int b = 1;
    while (b * 2 <= m)
        b *= 2;
    while (b) {
        modif(b, k, m, n);
        b /= 2;
    }
    for (auto key : q) {
        if (key.u == key.v) {
            fin_ans[key.ind] = 0;
            continue;
        }
        fin_ans[key.ind] = e[key.ans + 1].w;
    }
    for (int i = 1; i <= k; i++) {
        cout << fin_ans[i] << '\n';
    }
    return 0;
}