「BalticOI 2019 Day1」山谷
阿新 • • 發佈:2020-12-02
#include<bits/stdc++.h> using namespace std; #define N 1000010 #define int long long struct no{ int x,y; }; vector<no>qu[N]; int n,s,q,e,h[N],v[N*2],nxt[N*2],ec,in[N],w[N*2],ou[N],a[N],b[N],ct,d[N],mx[N],mn[N],mv[N],tg[N],vi[N],cc,dv[N],st[N],tp,ans[N],fw[N]; void add(int x,int y,int z){v[++ec]=y;w[ec]=z;nxt[ec]=h[x];h[x]=ec;} void dfs(int x,int fa){ in[x]=++ct; if(vi[x]){ mn[x]=++cc; st[cc]=x; } else mn[x]=1e9; for(int i=h[x];i;i=nxt[i]) if(v[i]!=fa){ dv[v[i]]=dv[x]+w[i]; d[v[i]]=d[x]+1; dfs(v[i],x); mn[x]=min(mn[x],mn[v[i]]); mx[x]=max(mx[x],mx[v[i]]); } ou[x]=ct; if(vi[x]) mx[x]=cc; } void pd(int o){ if(tg[o]){ tg[o*2]+=tg[o]; tg[o*2+1]+=tg[o]; mv[o*2]+=tg[o]; mv[o*2+1]+=tg[o]; tg[o]=0; } } void add(int o,int l,int r,int x,int y,int z){ if(x>y||x>1e8||y>1e8) return; if(r<x||y<l) return; if(x<=l&&r<=y){ mv[o]+=z; tg[o]+=z; return; } pd(o); int md=(l+r)/2; add(o*2,l,md,x,y,z); add(o*2+1,md+1,r,x,y,z); mv[o]=min(mv[o*2],mv[o*2+1]); } int qq(int o,int l,int r,int x,int y){ if(x>y||x>1e8||y>1e8) return 1e18; if(r<x||y<l) return 1e18; if(x<=l&&r<=y) return mv[o]; int md=(l+r)/2; pd(o); return min(qq(o*2,l,md,x,y),qq(o*2+1,md+1,r,x,y)); } void dd(int x,int fa){ for(int i=0;i<qu[x].size();i++){ no y=qu[x][i]; int e=a[y.x],f=b[y.x]; if(d[e]<d[f]) swap(e,f); if(in[e]<=in[x]&&in[x]<=ou[e]) ans[y.y]=min(ans[y.y],qq(1,1,cc,mn[e],mx[e])); else{ if(mn[e]>1) ans[y.y]=min(ans[y.y],qq(1,1,cc,1,mn[e]-1)); if(mx[e]<cc) ans[y.y]=min(ans[y.y],qq(1,1,cc,mx[e]+1,cc)); } } for(int i=h[x];i;i=nxt[i]) if(v[i]!=fa){ fw[v[i]]=w[i]; add(1,1,cc,mn[v[i]],mx[v[i]],-w[i]); if(mn[v[i]]>1) add(1,1,cc,1,mn[v[i]]-1,w[i]); if(mx[v[i]]<cc) add(1,1,cc,mx[v[i]]+1,cc,w[i]); dd(v[i],x); } add(1,1,cc,mn[x],mx[x],fw[x]); if(mn[x]>1) add(1,1,cc,1,mn[x]-1,-fw[x]); if(mx[x]<cc) add(1,1,cc,mx[x]+1,cc,-fw[x]); } signed main(){ scanf("%lld%lld%lld%lld",&n,&s,&q,&e); for(int i=1;i<n;i++){ int x,y,z; scanf("%lld%lld%lld",&x,&y,&z); a[i]=x; b[i]=y; add(x,y,z); add(y,x,z); } for(int i=1;i<=s;i++){ int x; scanf("%lld",&x); vi[x]=1; } dfs(e,0); memset(ans,127,sizeof(ans)); for(int i=1;i<=q;i++){ int x,y,e,f; scanf("%lld%lld",&x,&y); e=a[x]; f=b[x]; if(d[e]<d[f]) swap(e,f); if(in[e]<=in[y]&&in[y]<=ou[e]) qu[y].push_back((no){x,i}); else ans[i]=-1; } for(int i=1;i<=cc;i++) add(1,1,cc,i,i,dv[st[i]]); dd(e,0); for(int i=1;i<=q;i++){ if(ans[i]==-1) puts("escaped"); else if(ans[i]>1e17) puts("oo"); else printf("%lld\n",ans[i]); } }