제출 #564962

#제출 시각아이디문제언어결과실행 시간메모리
564962inluminasValley (BOI19_valley)C++17
100 / 100
443 ms50496 KiB
#include"bits/stdc++.h"
using namespace std;

#define ll long long
#define endl "\n"
#define fastio ios_base::sync_with_stdio(false)
#define inf LLONG_MAX
#define l first
#define r second

const int lmt=2e5+10;
int n,s,q,e,par[lmt][20],a[lmt],idx,lvl[lmt];
vector<pair<ll,ll>>adj[lmt];
vector<pair<int,int>>ed,Q[lmt];
array<int,2>id[lmt];
bool ok[lmt];
ll mn[3*lmt],Val[lmt],ans[lmt],lazy[lmt*3];

void build(int at,int L,int R){
	if(L==R){
		mn[at]=Val[L];
		return;
	}
	int mid=(L+R)>>1;
	build(at*2,L,mid);
	build(at*2+1,mid+1,R);
	mn[at]=min(mn[at*2],mn[at*2+1]);
}

void propagate(int at,int L,int R){
	mn[at]+=lazy[at];
	if(L==R){
		lazy[at]=0;
		return;
	}
	lazy[at*2]+=lazy[at],lazy[at*2+1]+=lazy[at],lazy[at]=0;
	return;
}

void updet(int at,int L,int R,int l,int r,ll val){
	propagate(at,L,R);
	if(r<L || R<l || r<l) return;
	if(l<=L && R<=r){
		lazy[at]+=val;
		propagate(at,L,R);
		return;
	}
	int mid=(L+R)>>1;
	updet(at*2,L,mid,l,r,val);
	updet(at*2+1,mid+1,R,l,r,val);
	mn[at]=min(mn[at*2],mn[at*2+1]);
}

ll query(int at,int L,int R,int l,int r){
	propagate(at,L,R);
	if(r<L || R<l || r<l) return (ll)1e16;
	if(l<=L && R<=r) return mn[at];
	int mid=(L+R)>>1;
	return min(query(at*2,L,mid,l,r),query(at*2+1,mid+1,R,l,r));
}

void dfs(int u,int p){
	a[++idx]=u;
	for(auto [v,w]:adj[u]){
		if(v==p) continue;
		par[v][0]=u,lvl[v]=lvl[u]+1;
		dfs(v,u);
	}
	a[++idx]=u;
}

void dfS(int u,int p,ll val){
	if(ok[u]){
		Val[id[u][0]]=val,Val[id[u][1]]=val;
	}else{
		Val[id[u][0]]=1e16,Val[id[u][1]]=1e16;
	}

	for(auto [v,w]:adj[u]){
		if(v==p) continue;
		ll val2=val+w;
		dfS(v,u,val2);
	}
}

ll lca(ll p,ll q){
  if(lvl[p]<lvl[q]) swap(p,q);
  for(ll i=19;i>=0;i--){
    if(lvl[p]-(1<<i)>=lvl[q]){
      p=par[p][i];
    }
  }
  if(p==q) return p;
  for(ll i=19;i>=0;i--){
    if(par[p][i]!=-1 && par[p][i]!=par[q][i]){
      p=par[p][i],q=par[q][i];
    }
  }
  return par[p][0];
}

ll Up(ll p,ll val){
	for(ll j=19;j>=0;j--){
		if(val>=(1<<j) && par[p][j]!=-1){
			p=par[p][j];
			val-=(1<<j);
		}
	}
	return p;
}

bool yes(ll o,ll p,ll q){
	ll l=lca(p,q);
 
	if(lvl[l]<=lvl[o] && lvl[o]<=lvl[p] && o==Up(p,lvl[p]-lvl[o])) return true;
	else if(lvl[l]<=lvl[o] && lvl[o]<=lvl[q] && o==Up(q,lvl[q]-lvl[o])) return true;
	return false;
}

void Dfs(int u,int p){
	for(auto [ID,i]:Q[u]){
		int U=ed[ID-1].l,V=ed[ID-1].r;

		if(!yes(U,u,e) || !yes(V,u,e)){
			ans[i]=-1;
			continue;
		}

		if(yes(U,1,u) && yes(V,1,u)){
			if(lvl[U]<lvl[V]) swap(U,V);

			updet(1,1,n+n,1,n+n,2e15);
			updet(1,1,n+n,id[U][0],id[U][1],-2e15);

			ans[i]=query(1,1,n+n,1,n+n);

			updet(1,1,n+n,1,n+n,-2e15);
			updet(1,1,n+n,id[U][0],id[U][1],2e15);
		}else{
			if(lvl[U]<lvl[V]) swap(U,V);

			updet(1,1,n+n,id[U][0],id[U][1],2e15);

			ans[i]=query(1,1,n+n,1,n+n);

			updet(1,1,n+n,id[U][0],id[U][1],-2e15);
		}
	}

	for(auto [v,w]:adj[u]){
		if(v==p) continue;

		updet(1,1,n+n,1,n+n,w);
		updet(1,1,n+n,id[v][0],id[v][1],-w-w);

		Dfs(v,u);

		updet(1,1,n+n,id[v][0],id[v][1],+w+w);
		updet(1,1,n+n,1,n+n,-w);
	}
}

int main(){
	fastio;

	cin>>n>>s>>q>>e;
	for(int i=0;i<=n;i++){
		for(int j=0;j<20;j++) par[i][j]=-1;
	}
	for(int i=1;i<n;i++){
		ll u,v,w;
		cin>>u>>v>>w;
		adj[u].push_back({v,w});
		adj[v].push_back({u,w});
		ed.push_back({u,v});
	}
	dfs(1,0);

	for(int i=1;i<=s;i++){
		int x;
		cin>>x;
		ok[x]=1;
	}

	for(int i=1;i<=n+n;i++){
		if(id[a[i]][0]) id[a[i]][1]=i;
		else id[a[i]][0]=i;
	}

	dfS(1,0,0);

	for(int i=1;i<=q;i++){
		int ID,u;
		cin>>ID>>u;

		Q[u].push_back({ID,i});
	}

	for(int j=1;j<20;j++){
		for(int i=1;i<=n;i++){
			if(par[i][j-1]==-1) continue;
			par[i][j]=par[par[i][j-1]][j-1];
		}
	}

	build(1,1,n+n);

	Dfs(1,0);

	for(int i=1;i<=q;i++){
		if(ans[i]==-1){
			cout<<"escaped"<<endl;
			continue;
		}

		if(ans[i]>1e15) cout<<"oo"<<endl;
		else cout<<ans[i]<<endl;
	}

	return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...