#include <bits/stdc++.h>
using namespace std;
int n,q,s,e;
vector<array<int,3>>g[100005];
int db[100005];
long long dis[100005];
int start[100005];
int stop[100005];
int tp[100005];
int timee;
long long tree[400005],lazy[400005];
int pos[100005];
void init(int id,int l,int r) {
    if(l==r) {
        tree[id]=dis[tp[l]];
        return ;
    }
    int mid=(l+r)/2;
    init(id*2,l,mid);
    init(id*2+1,mid+1,r);
    tree[id]=min(tree[id*2],tree[id*2+1]);
}
void push(int id) {
    if(lazy[id]==0)return;
    tree[id*2]+=lazy[id];
    tree[id*2+1]+=lazy[id];
    lazy[id*2]+=lazy[id];
    lazy[id*2+1]+=lazy[id];
    lazy[id]=0;
}
void upd(int id,int l,int r,int u,int v,int val) {
    if(l>v||r<u)return;
    if(l>=u&&r<=v) {
        tree[id]+=val;
        lazy[id]+=val;
        return;
    }
    push(id);
    int mid=(l+r)/2;
    upd(id*2,l,mid,u,v,val);
    upd(id*2+1,mid+1,r,u,v,val);
    tree[id]=min(tree[id*2],tree[id*2+1]);
}
long long getmin(int id,int l,int r,int u,int v) {
    if(l>v||r<u)return 1e18;
    if(l>=u&&r<=v)return tree[id];
    push(id);
    int mid=(l+r)/2;
    return min(getmin(id*2,l,mid,u,v),getmin(id*2+1,mid+1,r,u,v));
}
void dfs(int u,int pa) {
    timee++;
    start[u]=timee;
    tp[timee]=u;
    for(auto [v,w,id]:g[u])if(v!=pa) {
            dis[v]=dis[u]+w;
            pos[id]=v;
            dfs(v,u);
        }
    stop[u]=timee;
}
long long ans[100005];
vector<array<int,2>>vec[100005];
void dfs_query(int u,int pa) {
    for(auto [i,id]:vec[u]) {
        int l=start[pos[i]];
        int r=stop[pos[i]];
        if(start[u]>=l&&start[u]<=r)ans[id]=getmin(1,1,n,l,r);
        else ans[id]=min(getmin(1,1,n,1,l-1),getmin(1,1,n,r+1,n));
    }
    for(auto[v,w,_]:g[u])if(v!=pa) {
            upd(1,1,n,1,start[v]-1,+w);
            upd(1,1,n,stop[v]+1,n,+w);
            upd(1,1,n,start[v],stop[v],-w);
            dfs_query(v,u);
            upd(1,1,n,1,start[v]-1,-w);
            upd(1,1,n,stop[v]+1,n,-w);
            upd(1,1,n,start[v],stop[v],+w);
        }
}
int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    cin>>n>>s>>q>>e;
    for(int i=1; i<n; i++) {
        int u,v,w;
        cin>>u>>v>>w;
        g[u].push_back({v,w,i});
        g[v].push_back({u,w,i});
    }
    while(s--) {
        int u;
        cin>>u;
        db[u]=1;
    }
    dfs(1,0);
    for(int i=1; i<=n; i++)if(db[i]==0)dis[i]=1e18;
    dis[e]=-1e18;
    init(1,1,n);
    for(int i=1; i<=q; i++) {
        int I,r;
        cin>>I>>r;
        vec[r].push_back({I,i});
    }
    dfs_query(1,0);
    for(int i=1; i<=q; i++) {
        if(ans[i]<0) {
            cout<<"escaped"<<'\n';
            continue;
        }
        if(ans[i]>1e17)cout<<"oo"<<'\n';
        else cout<<ans[i]<<'\n';
    }
    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... |