Cod sursa(job #3194538)

Utilizator MrPuzzleDespa Fabian Stefan MrPuzzle Data 18 ianuarie 2024 15:15:28
Problema Radiatie Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 4.1 kb
#include <bits/stdc++.h>

#define DIM 15000
#define MAX 29

//#define int long long

using namespace std;

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

int n,m,q;
int x,y,c;

struct info{
    int x;
    int y;
    int c;
}v[2*DIM+5];

int t[DIM+5];

int dad[MAX+5][DIM+5];
int maxi[MAX+5][DIM+5];

int niv[DIM+5];

vector <pair<int,int>> L[DIM+5];

int root(int x){

    while(t[x] > 0){
        x = t[x];
    }

    return x;
}

void join(int x,int y,int c){

    x = root(x);
    y = root(y);

    if(-t[x] > -t[y]){
        swap(x,y);
    }

    t[y] += t[x];
    t[x] = y;
}

bool query(int x,int y){
    return root(x) != root(y);
}

bool cmp(info x,info y){
    return x.c < y.c;
}

bool u[DIM+5];

void dfs(int nod,int daddy = -1,int nivv = 1){

    niv[nod] = nivv;


    for(int i = 0;i<L[nod].size();i++){
        int vec = L[nod][i].first;
        int c = L[nod][i].second;

        if(vec == daddy){
            continue;
        }

        //cout<<nod<<" "<<vec<<" "<<c<<'\n';

        dad[0][vec] = nod;
        maxi[0][vec] = c;

        int j = 0;
        while(dad[j][dad[j][vec]]!=0){
            dad[j+1][vec] = dad[j][dad[j][vec]];
            maxi[j+1][vec] = max(maxi[j][vec],maxi[j][maxi[j][vec]]);
            j++;
        }

        dfs(vec,nod,nivv+1);
    }
}


signed main(){

    f>>n>>m>>q;
    for(int i=1;i<=m;i++){
        f>>x>>y>>c;
        v[i] = {x,y,c};
    }

    sort(v+1,v+m+1,cmp);

    for(int i=1;i<=n;i++){
        t[i] = -1;
    }

    for(int i=1;i<=m;i++){

        if(query(v[i].x,v[i].y)){

            L[v[i].x].push_back({v[i].y,v[i].c});
            L[v[i].y].push_back({v[i].x,v[i].c});

            join(v[i].x,v[i].y,v[i].c);
        }

    }

    int rad = -1;

    for(int i=1;i<=n;i++){
        if(t[i]<0){
            rad = i;
            break;
        }
    }

    //cout<<rad;

    dfs(rad);

    /*for(int i=1;i<=n;i++){

        cout<<i<<":\n";

        int j = 0;
        cout<<"dads: ";
        while(dad[j][i]!=0){
            cout<<dad[j][i]<<" ";
            j++;
        }
        cout<<"\n";
        cout<<"maxs: ";
        j = 0;
        while(dad[j][i]!=0){
            cout<<maxi[j][i]<<" ";
            j++;
        }
        cout<<"\n\n";
    }*/


    for(int i=1;i<=q;i++){

        f>>x>>y;

        int start = x,endd = y;

        //cout<<niv[x]<<" "<<niv[y]<<'\n';

        if(niv[x]!=niv[y]){

            if(niv[x] < niv[y]){
                swap(x,y);
            }

            int difference = niv[x] - niv[y];

            for(int j = MAX;j>=0;j--){
                if(difference >= (1<<j)){
                    difference -= (1<<j);
                    x = dad[j][x];
                }
            }

            //cout<<niv[x]<<" "<<niv[y]<<'\n';

        }

        //cout<<'\n';

        int lca;

        if(x != y){
            for(int j = MAX;j>=0;j--){
                if(dad[j][x] != dad[j][y]){
                    x = dad[j][x];
                    y = dad[j][y];
                }
            }

            lca = dad[0][x];
        }else{
            lca = x;
        }

        //cout<<start<<" "<<endd<<" "<<lca<<'\n';

        int maxi1 = 1;
        if(start!=lca){
            int difference = niv[start] - niv[lca];
            for(int j = MAX;j>=0;j--){
                if(difference >= (1<<j)){
                    difference -= (1<<j);
                    maxi1 = max(maxi1,maxi[j][start]);
                    start = dad[j][start];
                }
            }
        }

        int maxi2 = 1;
        if(endd!=lca){
            int difference = niv[endd] - niv[lca];
            for(int j = MAX;j>=0;j--){
                if(difference >= (1<<j)){
                    difference -= (1<<j);
                    maxi2 = max(maxi2,maxi[j][endd]);
                    endd = dad[j][endd];
                }
            }
        }

        //cout<<maxi1<<" "<<maxi2<<'\n'<<'\n';

        g<<max(maxi1,maxi2)<<'\n';

    }


    return 0;
}