//gm  --- akezhon
#include <bits/stdc++.h>
// #pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,fast-math,O3")
// #pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
#define pb push_back
#define pf push_front
#define F first
#define S second
#define all(v) v.begin(),v.end()
#define pii pair<int,int>
#define tm (tl+tr)/2
#define TL v+v, tl, tm
#define TR v+v+1, tm+1, tr
#define DA l <= tl && tr <= r
#define NE r < tl || tr < l
#define double long double
// #define int long long
using namespace std;
const int N=2e5+7;
const int mod=1e9+7;
const int inf=2e9;
int n, m, q, k;
int ans[N];
int l[N], r[N];
pii z[N];
int p[N];
int sz[N];
vector<pii>g[N];
int d[N];
bool ok[N];
vector<pair<int,pii>>reb;
int dgt(int a){
    if(a == p[a])return a;
    else return p[a] = dgt(p[a]);
}
void dun(int a, int b){
    a=dgt(a);
    b=dgt(b);
    if(a==b)return;
    if(sz[a]>sz[b]){
        p[b]=a;
        sz[a]+=sz[b];
    }
    else{
        p[a]=b;
        sz[b]+=sz[a];
    }
}
void AlemAmenov(){
    cin >> n >> m;
    for(int i=1; i <= m; i++){
        int a, b, c;
        cin >> a >> b >> c;
        reb.pb({c,{a,b}});
        g[a].pb({b,c});
        g[b].pb({a,c});
    }
    cin >> k;
    set<pii>st;
    for(int i=1; i <= n; i++)d[i]=inf;
    for(int x, i=1; i <= k; i++){
        cin >> x;
        d[x]=0;
        st.insert({0, x});
    }
    while(st.size()){
        int v = st.begin()->S;
        st.erase(st.begin());
        for(auto [u, w] : g[v]){
            if(d[v]+w < d[u]){
                st.erase({d[u], u});
                d[u]=d[v]+w;
                st.insert({d[u], u});
            }
        }
    }
    vector<pii>dist;
    int mxd=0;
    for(int i=1; i <= n; i++){
        dist.pb({d[i], i});   
        mxd=max(mxd, d[i]);
    }
    sort(all(dist));
    reverse(all(dist));
    cin >> q;
    for(int i=1; i <= q; i++){
        l[i]=0, r[i]=mxd;
        cin >> z[i].F >> z[i].S;
    }
    for(int op=1; op <= 30; op++){
        vector<pii>v;
        for(int i=1; i <= q; i++){
            if(l[i] <= r[i])v.pb({(l[i]+r[i])/2, i});
        }
        sort(all(v));
        reverse(all(v));
        for(int i=1; i <= n; i++){
            p[i]=i;
            sz[i]=1;
            ok[i]=0;
        }
        int cur=0;
        for(auto [mid, ind] : v){
            while(cur < n && mid <= dist[cur].F){
                int a = dist[cur].S;
                ok[a]=1;
                for(auto [u, w] : g[a]){
                    if(ok[u])dun(u, a);
                }
                cur++;
            }
            if(dgt(z[ind].F) == dgt(z[ind].S)){
                ans[ind]=mid;
                l[ind]=mid+1;
            }
            else{
                r[ind]=mid-1;
            }
        }
    }
    for(int i=1; i <= q; i ++){
        cout << ans[i] << '\n';
    }
}
signed main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    int RealName=1;
    // cin >> RealNam;
    // srand(time(0));
    while(RealName--)
        AlemAmenov();
    
return 0;
}
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... |