Cod sursa(job #2167990)

Utilizator Constantin.Dragancea Constantin Constantin. Data 14 martie 2018 08:56:20
Problema Radiatie Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.24 kb
#include <bits/stdc++.h>
using namespace std;

struct edge{
    int a, b, c;
} M[30010];

int n, m, k, q, Euler[30010], lvl[30010], first[15010], Rmq[30010][16], p[15010], cost[15010];
bool u[15010];
vector <pair<int,int> > v[15010];

bool cmp(edge a, edge b){
    return a.c < b.c;
}

int find(int i){
    if (i == p[i]) return i;
    p[i] = find(p[i]);
    return p[i];
}

void dfs(int q, int lv){
    u[q] = 1;
    Euler[++k] = q;
    first[q] = k;
    lvl[k] = lv;
    for (auto it: v[q]){
        if (!u[it.first]){
            p[it.first] = q;
            cost[it.first] = it.second;
            dfs(it.first, lv + 1);
            Euler[++k] = q;
            lvl[k] = lv;
        }
    }
}

int lca(int st, int dr){
    int l = dr - st + 1, put = 0;
    while ( (1<<(put + 1)) <= l) put++;
    if (lvl[Rmq[st][put]] < lvl[Rmq[st + l - (1<<put)][put]]) return Euler[Rmq[st][put]];
    else return Euler[Rmq[st + l - (1<<put)][put]];
}

int main(){
    ifstream cin ("radiatie.in");
    ofstream cout ("radiatie.out");
    cin >> n >> m >> q;
    for (int i=1; i<=m; i++){
        int x, y, z;
        cin >> x >> y >> z;
        M[i] = {x, y, z};
    }
    sort(M+1, M+1+m, cmp);
    for (int i=1; i<=n; i++) p[i] = i;
    for (int i=1; i<=m && k < n - 1; i++){
        int a = find(M[i].a), b = find(M[i].b);
        if (a != b){
            p[a] = b;
            v[M[i].a].push_back({M[i].b, M[i].c});
            v[M[i].b].push_back({M[i].a, M[i].c});
            k++;
        }
    }
    k = 0;
    for (int i=1; i<=n; i++) p[i] = 0;
    dfs(1, 1);
    //preprocesare pt rmq
    for (int i=1; i<=k; i++) Rmq[i][0] = i;
    for (int j=1; (1<<j) <= n; j++){
        for (int i=1; i + (1<<j) <= n; i++){
            if (lvl[Rmq[i][j-1]] < lvl[Rmq[i + (1<<(j-1))][j-1]]) Rmq[i][j] = Rmq[i][j-1];
            else Rmq[i][j] = Rmq[i + (1<<(j-1))][j-1];
        }
    }
    for (int i=1; i<=q; i++){
        int x, y, ans = 0;
        cin >> x >> y;
        if (first[x] > first[y]) swap(x, y);
        int sf = lca(first[x], first[y]);
        while (x != sf) ans = max(ans, cost[x]), x = p[x];
        while (y != sf) ans = max(ans, cost[y]), y = p[y];
        cout << ans << "\n";
    }
    return 0;
}