Cod sursa(job #2566069)

Utilizator NashikAndrei Feodorov Nashik Data 2 martie 2020 18:40:13
Problema Radiatie Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.32 kb
//#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
ifstream cin("radiatie.in");
ofstream cout("radiatie.out");
vector<pair<int,int> > graf[15005];
vector<int> legit[15005];
int ap[15005],tata[15005],sz[15005];
pair<int,pair<int,int> > edge[15005];
int euclid[60005],niv[60005],contor,nex[20][60005],cs[20][60005],rmq[20][60005],put[20],lg[100000],fr[60005];
int daddy(int a){
    if(tata[a]==a){
        return a;
    }
    tata[a]=daddy(tata[a]);
    return tata[a];
}
void unite(int a,int b,int c){
    int aa=a,bb=b;
    a=daddy(a);
    b=daddy(b);
    if(a==b)
        return;
    if(sz[a]<sz[b]){
        swap(a,b);
    }
    tata[b]=a;
    sz[a]+=sz[b];
    //cout<<'|'<<aa<<" "<<bb<<"|\n";
    graf[aa].push_back(make_pair(bb,c));
    graf[bb].push_back(make_pair(aa,c));
}
void dfs(int v,int nv){
    ap[v]=1;
    euclid[++contor]=v;
    niv[contor]=nv;
    for(auto u:graf[v]){
        if(ap[u.first]==1)
        continue;
        dfs(u.first,nv+1);
        euclid[++contor]=v;
        niv[contor]=nv;
        legit[v].push_back(u.first);
        nex[0][u.first]=v;
        cs[0][u.first]=u.second;
    }
}

int maxi(int a,int b){
    if(a>b)
        return a;
    return b;
}
int ma(int a,int b){
    if(niv[a]>niv[b]){
        return b;
    }
    return a;
}

int solve_lant(int a,int b){
    if(niv[fr[a]]<niv[fr[b]]){
        swap(a,b);
    }
    int dist=niv[fr[a]]-niv[fr[b]],mx=0;
    //cout<<"lant "<<a<<" "<<b<<" "<<dist<<" ";
    while(dist!=0){
        int e=lg[dist];
        mx=maxi(mx,cs[e][a]);
        a=nex[e][a];
        dist-=put[e];
    }
    //cout<<mx<<"\n";
    return mx;
}
int find_lca(int a,int b){
    a=fr[a];
    b=fr[b];
    if(a>b)
        swap(a,b);
    int dist=b-a+1;
    int e=lg[dist];
    return ma(rmq[e][a],rmq[e][b-put[e]+1]);
}
int solve(int a,int b){
    int lca=find_lca(a,b);
    return maxi(solve_lant(a,lca),solve_lant(b,lca));
}
int main()
{
    int n,m,k,a,b,c;
    cin>>n>>m>>k;
    for(int i=1;i<=n;i++){
        sz[i]=1;
        tata[i]=i;
    }
    for(int i=1;i<=m;i++){
        cin>>a>>b>>c;
        edge[i].first=c;
        edge[i].second.first=a;
        edge[i].second.second=b;
    }
    sort(edge+1,edge+m+1);
    for(int i=1;i<=m;i++){
        unite(edge[i].second.first,edge[i].second.second,edge[i].first);
    }
    int root=1;
    nex[0][root]=root;
    dfs(root,1);
    for(int i=contor;i>=1;i--){
        fr[euclid[i]]=i;
        rmq[0][i]=i;
    }
    put[0]=1;
    for(int i=1;i<=13;i++){
        for(int j=1;j<=n;j++){
            nex[i][j]=nex[i-1][nex[i-1][j]];
            cs[i][j]=maxi(cs[i-1][j],cs[i-1][nex[i-1][j]]);
        }
        put[i]=put[i-1]*2;
        lg[put[i]]++;
    }
    for(int i=1;i<=95000;i++){
        lg[i]+=lg[i-1];
    }
    //cout<<"\n";
    for(int i=1;i<=13;i++){
        for(int j=1;j<=contor;j++){
            if(j+put[i]>contor)
                break;
            rmq[i][j]=ma(rmq[i-1][j],rmq[i-1][j+put[i-1]]);
        }
    }
    /*cout<<"\n\n";
    for(int i=0;i<=13;i++){
        for(int j=1;j<=n;j++){
            cout<<cs[i][j]<<" ";
        }
        cout<<"\n";
    }
    cout<<"\n\n";

    for(int i=1;i<=n;i++){
        cout<<i<<"->";
        for(auto u:legit[i]){
            cout<<u<<" ";
        }
        cout<<"\n";
    }
*/
    for(int i=1;i<=k;i++){
        cin>>a>>b;
        cout<<solve(a,b)<<"\n";
    }
    return 0;
}