Submission #1154488

#TimeUsernameProblemLanguageResultExecution timeMemory
1154488LuvidiSightseeing (NOI14_sightseeing)C++20
15 / 25
3503 ms156968 KiB
#include <bits/stdc++.h>
using namespace std;

const int maxn=5e5;
int vw[2*maxn],du[2*maxn],ls,up[2*maxn][20],ch[2*maxn][2],dt[2*maxn];

int rp(int x){
    if(x==du[x])return x;
    return du[x]=rp(du[x]);
}

void jn(int x,int y,int v){
    x=rp(x);y=rp(y);
    if(x==y)return;
    du[x]=++ls;
    du[y]=ls;
    vw[ls]=v;
    up[x][0]=up[y][0]=up[ls][0]=ls;
    ch[ls][0]=x,ch[ls][1]=y;
}

void dfs(int v){
    if(ch[v][0]){
        dt[ch[v][0]]=dt[ch[v][1]]=dt[v]+1;
        dfs(ch[v][0]);
        dfs(ch[v][1]);
    }
}

int main(){
    int n,m,q;
    cin>>n>>m>>q;
    pair<int,pair<int,int>> ed[m];
    for(int i=0;i<m;i++)cin>>ed[i].second.first>>ed[i].second.second>>ed[i].first;
    sort(ed,ed+m);
    reverse(ed,ed+m);
    iota(du,du+2*n,0);
    ls=n;
    for(auto[w,p]:ed){
        auto[u,v]=p;
        jn(u,v,w);
    }
    for(int x=1;x<20;x++){
        for(int i=1;i<2*n;i++)up[i][x]=up[up[i][x-1]][x-1];
    }
    dfs(ls);
    while(q--){
        int x;
        cin>>x;
        int y=1;
        if(dt[x]>dt[y])swap(x,y);
        for(int i=19;i>-1;i--)if(dt[y]-(1<<i)>=dt[x])y=up[y][i];
        for(int i=19;i>-1;i--)if(up[x][i]!=up[y][i])x=up[x][i],y=up[y][i];
        if(x!=y)x=up[x][0];
        cout<<vw[x]<<'\n';
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...