This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#pragma GCC optimize("O3")
#include <bits/stdc++.h>
 
using namespace std;
 
#define ll long long int
#define oo 1e17
#define pii pair<int, int>
const int MAX = 1e5 + 5;
const int LOGMAX = 20;
int n, s, q, e;
struct DATA{
    ll dest = 0, dist = 0, ans = oo;
};
vector<pii> g[MAX];
DATA par[LOGMAX][MAX];
ll mindist[MAX];
vector<pii> edges;
bool isShop[MAX];
int timeIn[MAX], timeOut[MAX];
int t = 1;
void dfs(int node, int p){
    timeIn[node] = t++;
    par[0][node].dest = p;
    if(isShop[node]) par[0][node].ans = 0;
    for(pii to : g[node]){
        if(to.first == p) continue;
        par[0][to.first].dist = to.second;
        dfs(to.first, node);
        par[0][node].ans = min(par[0][to.first].ans + to.second, par[0][node].ans);
    }
    timeOut[node] = t++;
}
bool isAnc(int u, int v){
    return (timeIn[u] <= timeIn[v]) && (timeOut[u] >= timeOut[v]);
}
ll lift(int u, int v){
    ll d = 0;
    ll res = oo;
    for(int j = LOGMAX - 1; j >= 0; j --){
        if(!isAnc(par[j][u].dest, v)){
            res = min(res, par[j][u].ans + d);
            d += par[j][u].dist;
            u = par[j][u].dest;
        }
    }
    return min(res, d + par[0][u].ans);
}
int main(){
    cin >> n >> s >> q >> e;
    for(int i = 1; i <= n - 1; i++){
        int u, v, a; cin >> u >> v >> a;
        g[u].push_back({v, a});
        g[v].push_back({u, a});
        edges.push_back({u, v});
    }
    for(int i = 1; i <= s; i++){
        int a; cin >> a;
        isShop[a] = 1;
    }
    dfs(e, e);
    for(int j = 1; j < LOGMAX; j++){
        for(int i = 1; i <= n; i++){
            int m = par[j - 1][i].dest;
            par[j][i].dest = par[j - 1][m].dest;
            par[j][i].dist = par[j - 1][i].dist + par[j - 1][m].dist;
            par[j][i].ans = min(par[j - 1][i].ans, par[j - 1][m].ans + par[j - 1][i].dist);
        }
    }
    while(q--){
        int p, node; cin >> p >> node;
        int u = edges[p - 1].first;
        int v = edges[p - 1].second;
        if(!(isAnc(u, node) && isAnc(v, node))){
            cout << "escaped\n";
            continue;
        }
        if(isAnc(v, u)){
            swap(u, v);
        }
        if(lift(node, u) >= oo){
            cout << "oo\n"; 
        }
        else{
            cout << lift(node, u) << '\n';
        }
    }
}
| # | 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... |