Submission #1223640

#TimeUsernameProblemLanguageResultExecution timeMemory
1223640onimValley (BOI19_valley)C++20
100 / 100
149 ms52108 KiB

//         author : MOHAMMED OMAR FAIAZ ONIM
//         gmail : u2104029@student.cuet.ac.bd
//         戦え

#include <bits/stdc++.h>
using namespace std;
const int mod = 1e9 + 7;
const int N = 2e5 + 5;
const long long INF = 1e18;

long long bigmod(long long b, long long p, long long m){ // b ^ p % m
    if (p == 0)return 1;
    if (p % 2 == 0){
        long long x = bigmod(b, p / 2, m) % m;
        return (x * x) % m;
    }else return (b % m * bigmod(b, p - 1, m)) % m;
}
long long gcd(long long a, long long b){ return b == 0 ? a : gcd(b, a % b); } // assuming a>=b
long long lcm(long long a, long long b){ return (a / gcd(a, b)) * b * 1LL; }
long long inv(long long x) {
   if(x<=1)return x;
   return  mod - (mod / x) * inv(mod % x) % mod;
}
long long inv_mod(long long a, long long m) { return bigmod(a, m - 2, m); }// Using Fermat's theorem -> a^-1 ≡ a^(m-2) (mod m) where gcd(a,m)==1.
#define ll long long
#ifndef ONLINE_JUDGE
#define debug(x) cerr << #x <<" "; _print(x); cerr << endl;
#else
#define debug(x)
#endif

void _print(long long t) {cerr << t;}
void _print(int t) {cerr << t;}
void _print(string t) {cerr << t;}
void _print(char t) {cerr << t;}
void _print(long double t) {cerr << t;}
void _print(double t) {cerr << t;}
void _print(unsigned long long t) {cerr << t;}

template <class T, class V> void _print(pair <T, V> p);
template <class T> void _print(vector <T> v);
template <class T> void _print(set <T> v);
template <class T, class V> void _print(map <T, V> v);
template <class T> void _print(multiset <T> v);
template <class T, class V> void _print(pair <T, V> p) {cerr << "{"; _print(p.first); cerr << ","; _print(p.second); cerr << "}";}
template <class T> void _print(vector <T> v) {cerr << "[ "; for (T i : v) {_print(i); cerr << " ";} cerr << "]";}
template <class T> void _print(set <T> v) {cerr << "[ "; for (T i : v) {_print(i); cerr << " ";} cerr << "]";}
template <class T> void _print(multiset <T> v) {cerr << "[ "; for (T i : v) {_print(i); cerr << " ";} cerr << "]";}
template <class T, class V> void _print(map <T, V> v) {cerr << "[ "; for (auto i : v) {_print(i); cerr << " ";} cerr << "]";}

// ll dis[N];
// ll mn[N];
// bool shp[N];
// ll sz[N];
// ll fi[N];
// int timer;
// vector<vector<pair<ll,ll>>>adj(N);
// int tin[N];
// vector<ll>path;
// void dfs(int ver,int par,ll dist,int time){

//     mn[ver]=INF;
//     dis[ver]=dist;
//     fi[ver]=timer++;
//     tin[ver]=time;
//     path.push_back(ver);
//     sz[ver]=1;

//     if(shp[ver])mn[ver]=dist;

//     for(auto to : adj[ver]){
//         if(to.first!=par){
//             dfs(to.first,ver,dist+to.second,time+1);
//             mn[ver]=min(mn[ver],mn[to.first]);
//             sz[ver]+=sz[to.first];
//         }
//     }

// }

ll l;
vector<vector<pair<ll,ll>>> adj(N);

ll timer;
ll tin[N];
ll tout[N];
ll up[N][20];
ll sz[N];
ll mn[N];
bool shop[N];
ll mm[N][20];
ll dis[N];
ll n,s,q,e;
void dfs(int v, int p,ll dist)
{
    dis[v]=dist;
    tin[v]=++timer;
    up[v][0] = p;
    mn[v]=INF;

    if(shop[v])mn[v]=dist;

    for (auto u : adj[v]) {
        if (u.first != p){
            dfs(u.first, v,dist+u.second);
            mn[v]=min(mn[u.first],mn[v]);
        }
    }

    if(mn[v]!=INF){
        mm[v][0]=mn[v]-2*dis[v];
    }else mm[v][0]=INF;

    tout[v] = ++timer;
}

bool is_ancestor(ll u, ll v)
{
    return tin[u] <= tin[v] && tout[u] >= tout[v];
}
ll lca(ll u, ll v) {
  if (is_ancestor(u, v)) return u;
  if (is_ancestor(v, u)) return v;
  for (ll i = l; i >= 0; --i) {
    if (!is_ancestor(up[u][i], v))
      u = up[u][i];
  }
  return up[u][0];
}
void preprocess(ll root) {
    timer = 0;
    l = ceil(log2(n));
    dfs(root, root,0);
}

int main()
{
// #ifndef ONLINE_JUDGE
//         freopen("Error.txt", "w", stderr);
// #endif

    ios_base::sync_with_stdio(false);cin.tie(NULL);

    ll testcases=1;
    // cin>>testcases;

    while(testcases--){
        cin>>n>>s>>q>>e;
        

        ll a[n-1],b[n-1];


        for(ll  i=0;i<n-1;i++){
            ll u,v,w;
            cin>>u>>v>>w;

            a[i]=u;
            b[i]=v;

            adj[u].push_back({v,w});
            adj[v].push_back({u,w});
        }

        for(ll i=0;i<s;i++){
            ll x;
            cin>>x;
            shop[x]=1;
        }

        
        
        preprocess(e);

        for(int j=1;j<18;j++){
            for(int i=1;i<=n;i++){
                up[i][j]=up[up[i][j-1]][j-1];
                mm[i][j]=min(mm[up[i][j-1]][j-1],mm[i][j-1]);
            }
        }

        while(q--){
            ll l,r;
            cin>>l>>r;
            // cs++;

            --l;
            int u=a[l],v=b[l];

            if(is_ancestor(v,u))swap(u,v);
             
             if(!is_ancestor(v,r))cout<<"escaped\n";
             else{
                ll best=mm[v][0],extra=dis[r];
                for(int k=17;k>=0;k--){
                    if(is_ancestor(v,up[r][k])){
                        best=min(best,mm[r][k]);
                        r=up[r][k];
                    }
                }
                if(best==INF)cout<<"oo\n";
                else cout<<best+extra<<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...