Submission #497906

#TimeUsernameProblemLanguageResultExecution timeMemory
497906armashkaValley (BOI19_valley)C++17
100 / 100
372 ms91232 KiB
#include <bits/stdc++.h>
 
//#pragma comment(linker, "/stack:200000000")
//#pragma GCC optimize("Ofast")
//#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
 
#define fast ios_base::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
#define all(v) v.begin(),v.end()
#define pb push_back
#define sz size()
#define ft first
#define sd second
 
using namespace std;
typedef long long ll;
typedef pair<ll, ll> pll;
typedef unsigned long long ull;
 
const int N = 1e6 + 5;
const ll M = 1e8;
const ll inf = 1e18;
const ll mod = 1e9;
const double Pi = acos(-1); 
 
ll binpow(ll x, ll ti) { ll res = 1;while (ti){if(ti & 1)res *= x;x *= x;ti >>= 1; x %= mod; res %= mod;} return res;}
ll binmul(ll x, ll ti) { ll res = 0;while (ti){if(ti & 1)res += x;x += x;ti >>= 1; x %= mod; res %= mod;} return res;}
ll nok(ll a, ll b) { return (a*b)/__gcd(abs(a),abs(b)) * (a*b > 0 ? 1 : -1); }
bool odd(ll n) { return (n % 2 == 1); }
bool even(ll n) { return (n % 2 == 0); }            
 
ll n, s, k, e, dp[N], in[N], out[N], timer, up[N][30], mnn[N][30], sel[N], h[N], d[N];
pll edge[N];
vector <pll> g[N];
 
void dfs(ll v, ll pr) {
	up[v][0] = pr;
	in[v] = ++ timer;
	ll mn = inf;
	for (auto [to, w] : g[v]) {
		if (to != pr) {
			h[to] = h[v] + 1;
			d[to] = d[v] + w;
			dfs(to, v);
			mn = min(mn, dp[to] + w);			
		}
	}
	if (sel[v]) mn = 0;
	dp[v] = mn;
	for (auto [to, w] : g[v]) {
		if (to != pr) {
			mnn[to][0] = dp[v] - d[v];
		}
	}
	out[v] = ++ timer;
}
 
ll get(ll u, ll v, ll pr) {
	if (in[v] >= in[pr] && out[v] <= out[pr]);
	else return inf;
	ll mn = dp[v] + (d[u] - d[v]);
	for (int i = 0; i <= 25; ++ i) {
		ll cur = up[v][i];
		//cout << cur << " "  << pr << "\n";
		if (in[cur] >= in[pr] && out[cur] <= out[pr]) {
			mn = min(mn, mnn[v][i] + d[u]);	
		} else {
			mn = min(mn, get(u, up[v][i - 1], pr));
			break;
		}
	}
	return mn;
}
 
const void solve(/*Armashka*/) {
	cin >> n >> s >> k >> e;
	for (int i = 1; i < n; ++ i) {
		ll u, v, w;
		cin >> u >> v >> w;
		g[u].pb({v, w});
		g[v].pb({u, w});
		edge[i] = {u, v};		
	}
	for (int i = 1; i <= n; ++ i) dp[i] = inf;
	for (int i = 1; i <= s; ++ i) {
		ll x; cin >> x;
		sel[x] = 1;
	}
	dfs(e, -1);
	//for (int i = 1; i <= n; cout << dp[i] << " ", ++ i);
	for (int i = 1; i <= 25; ++ i) {
		for (int j = 1; j <= n; ++ j) {
			up[j][i] = up[up[j][i - 1]][i - 1];
			mnn[j][i] = min(mnn[j][i - 1], mnn[up[j][i - 1]][i - 1]);
		}
	}
	for (int i = 1; i <= k; ++ i) {
		ll id, start;                                
		cin >> id >> start;
		ll a = edge[id].ft, b = edge[id].sd;
		if (h[a] < h[b]) swap(a, b);
		if (in[a] > in[start] || out[a] < out[start]) {
			cout << "escaped\n";
			continue;
		} 		
		
		ll res = get(start, start, a);
		if (res == inf) cout << "oo\n";
		else cout << res << "\n";
	}
}
            
signed main() {
    fast;
    //freopen("divide.in", "r", stdin);
    //freopen("divide.out", "w", stdout);
    int tt = 1;
    //cin >> tt;
    while (tt --) {                                                
        solve();
    }
}
 
/*
5 4 4
1 2
3 1
3 4
5 3
4 5 2 3
2 1 3 1
1 3 5
2 3 4 5
2 1 3 1
*/
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...