| # | Time | Username | Problem | Language | Result | Execution time | Memory | 
|---|---|---|---|---|---|---|---|
| 1275503 | TVSown | Valley (BOI19_valley) | C++17 | 0 ms | 0 KiB | 
#include<bits/stdc++.h>
using namespace std;
#define F first
#define S second
#define pb push_back
#define pi pair<int, int>
#define szz(s) (s.size())
#define all(s) s.begin(), s.end()
#define FOR(i, a, b) for(int i = a; i <= b; ++i)
#define REP(i, a, b) for(int i = a; i >= b; --i)
#define int long long
const int N = 1e5 + 5, MOD = 1e9 + 7;
int n, s, q, E, TIME;
int in[N], out[N], have[N];
long long d[N], ans[N];
vector<pi> e[N];
pi edge[N];
vector<pi> Q[N];
void pre(int u, int p){
    in[u] = ++TIME;
    for(auto [v, w] : e[u]){
        if(v == p) continue;
        d[v] = d[u] + w;
        pre(v, u);
    }
    out[u] = TIME;
}
int isChild(int u, int v){
    return in[u] <= in[v] && out[v] <= out[u];
}
long long st[4 * N], lz[4 * N];
void down(int id){
    st[2 * id] += lz[id];
    st[2 * id + 1] += lz[id];
    lz[2 * id] += lz[id];
    lz[2 * id + 1] += lz[id];
    lz[id] = 0;
}
void update(int id, int l, int r, int u, int v, long long x){
    if(l > v || r < u) return;
    if(u <= l && r <= v){
        st[id] += x;
        lz[id] += x;
        return;
    }
    down(id);
    int m = (l + r) / 2;
    update(2 * id, l, m, u, v, x);
    update(2 * id + 1, m + 1, r, u, v, x);
    st[id] = min(st[2 * id], st[2 * id + 1]);
}
long long get(int id, int l, int r, int u, int v){
    if(l > v || r < u) return 1e15;
    if(u <= l && r <= v) return st[id];
    down(id);
    int m = (l + r) / 2;
    return min(get(2 * id, l, m, u, v), get(2 * id + 1, m + 1, r, u, v));
}
void dfs(int u, int p, int S){
    update(1, 1, n, in[u], out[u], -S);
    update(1, 1, n, 1, in[u] - 1, S);
    update(1, 1, n, out[u] + 1, n, S);
//    cout << u << " " << Q[u].size() << "\n";
//    cout << "TEST: " << u << "\n";
//    FOR(u, 1, n){
//        cout << get(1, 1, n, in[u], in[u]) << " ";
//    }
//    cout << "\n";
    for(auto [id, i] : Q[u]){
        int x = edge[i].F, y = edge[i].S;
//        cout << u << " " << x << " " << y << "\n";
        if(isChild(y, u)){
            ans[id] = get(1, 1, n, in[y], out[y]);
        }else{
            ans[id] = min(get(1, 1, n, 1, in[y] - 1), get(1, 1, n, out[y] + 1, n));
        }
    }
    for(auto [v, w] : e[u]){
        if(v == p) continue;
        dfs(v, u, w);
    }
    update(1, 1, n, in[u], out[u], S);
    update(1, 1, n, 1, in[u] - 1, -S);
    update(1, 1, n, out[u] + 1, n, -S);
}
void solve(){
    cin >> n >> s >> q >> E;
    FOR(i, 1, n - 1){
        int u, v, w; cin >> u >> v >> w;
        e[u].pb({v, w});
        e[v].pb({u, w});
        edge[i] = {u, v};
    }
    FOR(i, 1, s){
        int c; cin >> c;
        have[c] = 1;
    }
    pre(1, 0);
    FOR(u, 1, n){
//        cout << have[u] << " " << in[u] << " " << d[u] << '\n';
        if(have[u]) update(1, 1, n, in[u], in[u], d[u]);
        else{
            update(1, 1, n, in[u], in[u], 1e15);
        }
    }
    FOR(id, 1, q){
        int i, R; cin >> i >> R;
        int u = edge[i].F, v = edge[i].S;
        if(in[u] > in[v]) swap(u, v);
//        cout << v << " " << R << " " << E << "\n";
        if(isChild(v, R) == isChild(v, E)){
            ans[id] = -1;
        }else{
            Q[R].pb({id, i});
//            cout << id << " " << R << "\n";
        }
    }
    dfs(1, 0, 0);
    FOR(id, 1, q){
        if(ans[id] == -1) cout << "escaped\n";
        else if(ans[id] <= 1e14) cout << ans[id] << "\n";
        else cout << "oo\n";
    }
}
int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);
    solve();
}
