Submission #1157751

#TimeUsernameProblemLanguageResultExecution timeMemory
1157751MPGValley (BOI19_valley)C++20
100 / 100
116 ms58536 KiB
// #pragma GCC optimization ("unroll-loops")
// #pragma GCC optimization ("O1, O2, O3, Ofast")
// #pragma GCC optimization ("trapv")
// #pragma GCC optimization ("sse, sse2, sse3, sse4, sse4.1, sse4.2, avx")



#include <bits/stdc++.h>
using namespace std;
typedef long long                           ll;
#define                                     max_heap priority_queue<ll>
#define                                     min_heap priority_queue<pair <ll, ll>, vector<pair <ll, ll>>, greater<pair <ll, ll>>> // size(), push(), top(), pop();
//#define                                     min_heap priority_queue<ll, vector<ll>, greater<ll>>
#define                                     sariE cin.tie(NULL); cout.tie(NULL); ios_base::sync_with_stdio(false);
#define                                     filE freopen("in.txt", "r", stdin); freopen("out1.txt", "w", stdout);
#define                                     endl '\n'
#define                                     md(a) (a % mod + mod) % mod
//cout << setprecision(5) << f;
ll const maxn = 2e5 + 10;
ll const inf = 2e18;
ll const loG = 23;
ll const mod = 1e6 + 3;//998244353; //1e9 + 9, // 1e9 + 7;
ll const sq = 750;
ll power(ll a, ll b, ll mod){if (b == 0) return 1; if (b == 1) return a; ll x = power(a, b / 2, mod); return (((x * x) % mod) * (b % 2 ? a : 1)) % mod;}




ll n, t, q, root, dis[maxn], fas[maxn], fn[maxn], st[maxn], val[maxn], tim;
pair <ll, ll> par[loG][maxn];
pair <pair <ll, ll>, ll> yal[maxn];
vector <pair <ll, ll>> g[maxn];
bool sup[maxn];



void dfs(ll v, ll w, ll p){
    tim++;
    st[v] = tim;
    fas[v] = inf;
    if (sup[v])
        fas[v] = 0;
    if (p != -1){
        dis[v] = dis[p] + w;
        par[0][v].first = p;
    }
    for (auto u : g[v]){
        if (u.first != p){
            dfs(u.first, u.second, v);
            fas[v] = min(fas[v], u.second + fas[u.first]);
        }
    }
    tim++;
    fn[v] = tim;
}

bool ispar(ll v, ll u){
    if (st[v] <= st[u] && fn[v] >= fn[u])
        return 1;
    return 0;
}


ll ans(ll u, ll v){
    ll boz = inf;
    ll vv = v;
    for (int i = loG - 1; i >= 0; i--){
        if (!ispar(par[i][vv].first, u)){
            boz = min(boz, par[i][vv].second);
            vv = par[i][vv].first;
        }
    }
    if (vv != u)
        boz = min(boz, par[0][vv].second);
    return boz;
}




int main(){
sariE;// filE;

cin >> n >> t >> q >> root;
for (int i = 1; i < n; i++){
    ll a, b, c; cin >> a >> b >> c;
    yal[i].first.first = a;
    yal[i].first.second = b;
    yal[i].second = c;
    g[a].push_back({b, c});
    g[b].push_back({a, c});
}

for (int i = 1; i < t + 1; i++){
    ll x; cin >> x;
    sup[x] = 1;
}
dfs(root, 0, -1);
par[0][root] = {root, inf};
for (int i = 1; i < n + 1; i++){
    val[i] = fas[i] - dis[i];
    //cout << i << ' ' << fas[i] << ' ' << dis[i] << endl;
}
for (int i = 1; i < n; i++){
    if (st[yal[i].first.first] < st[yal[i].first.second])
        swap(yal[i].first.first, yal[i].first.second);
}

for (int i = 1; i < n + 1; i++){
    par[0][i].second = val[par[0][i].first];
}

for (int k = 1; k < loG; k++){
    for (int i = 1; i < n + 1; i++){
        par[k][i].first = par[k - 1][par[k - 1][i].first].first;
        par[k][i].second = min(par[k - 1][i].second, par[k - 1][par[k - 1][i].first].second);
    }
}

while (q--){
    ll l, v; cin >> l >> v;
    ll a = yal[l].first.first, b = yal[l].first.second;
    if (!ispar(a, v) || !ispar(b, v)){
        cout << "escaped" << endl;
        continue;
    }
    ll ret = val[v];
    ret = min(ret, ans(a, v));
    //cout << ret << endl;
    if (ret >= 1e18){
        cout << "oo" << endl;
    }
    else
        cout << dis[v] + ret << endl;

}






}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...