Submission #696152

#TimeUsernameProblemLanguageResultExecution timeMemory
696152amirhoseinfar1385Valley (BOI19_valley)C++17
0 / 100
124 ms33276 KiB
#include<bits/stdc++.h>
using namespace std;
struct yal{
	int u,v,w,bache;
	int getad(int fu){
		int ret=(fu^u^v);
		return ret;
	}
};
int inf=INT_MAX-20;
struct flca{
	int dis,wi,mina;
	flca(){
		mina=inf;
		dis=0;
		wi=0;
	}
};
const int maxn=100000+5;
vector<yal>alled;
vector<vector<int>>adj;
int n,s,rishe,q;
vector<int>dis;
pair<int,int>stf[maxn];
int para[maxn];
flca lca[20][maxn];
int timea=0;

void dfs(int u,int par=0,int ind=0){
	timea++;
	stf[u].first=timea;
	if(u!=rishe){
		para[u]=ind;
		alled[ind].bache=u;
	}
	for(auto x:adj[u]){
		int y=alled[x].getad(u);
		if(y!=par){
			dfs(y,u,x);
			dis[u]=min(dis[u],dis[y]+alled[x].w);
		}
	}
	stf[u].second=timea;
}

flca merge(flca a,flca b){
	flca c;
	c.dis=a.dis+b.dis;
	c.wi=b.wi;
	c.mina=min(a.mina,b.mina+a.dis);
	return c;
}

void callca(){
	for(int i=0;i<20;i++){
		for(int j=1;j<=n;j++){
			if(i==0){
				if(j==rishe){
					continue;
				}
				//if(i==0&&j==5){
			//		cout<<" what "<<alled[para[j]].w<<"\n";
			//	}
				lca[i][j].dis=alled[para[j]].w;
				lca[i][j].wi=alled[para[j]].getad(j);
				lca[i][j].mina=alled[para[j]].w+dis[lca[i][j].wi];
				continue;
			}
			lca[i][j]=merge(lca[i-1][j],lca[i-1][lca[i-1][j].wi]);	
		}
	}
}

void solve(int ind,int v){
	int u=alled[ind].bache;
	if(stf[u].first<=stf[v].first&&stf[u].second>=stf[v].second){
		flca now;
		now.dis=0;
		now.wi=v;
		now.mina=dis[v];
		for(int i=19;i>=0;i--){
			if(lca[i][v].wi==0){
				continue;
			}
			if(stf[lca[i][v].wi].first<=stf[u].first&&stf[lca[i][v].wi].second>=stf[u].second){
				continue;
			}
			now=merge(now,lca[i][v]);
			v=now.wi;
		}
		//cout<<v<<" "<<u<<" asd \n";
		if(u!=v){
			now=merge(now,lca[0][v]);
		}
		if(now.mina==inf){
			cout<<"oo\n";
		}
		else{
			cout<<now.mina<<"\n";
		}
	}
	else{
		cout<<"escaped\n";
	}
}


int main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin>>n>>s>>q>>rishe;
	alled.resize(n-1);
	adj.resize(n+1);
	dis.resize(n+1,inf);
	for(int i=0;i<n-1;i++){
		cin>>alled[i].u>>alled[i].v>>alled[i].w;
		adj[alled[i].u].push_back(i);
		adj[alled[i].v].push_back(i);
	}
	for(int i=0;i<s;i++){
		int d;
		cin>>d;
		dis[d]=0;
	}
	dfs(rishe);
	callca();
	for(int i=0;i<q;i++){
		int ind,u;
		cin>>ind>>u;
		ind--;
		solve(ind,u);
	}
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...