Submission #866790

#TimeUsernameProblemLanguageResultExecution timeMemory
866790ElioritaValley (BOI19_valley)C++14
100 / 100
303 ms61432 KiB
#include<bits/stdc++.h>
#define int long long
#define pb push_back
#define x first
#define y second
#define getbit(u,i) ((u>>i)&1)
#define all(x) x.begin(),x.end()
#define N 200001
using namespace std;
typedef pair<int,int> ii;
typedef pair<double,double> dd;
struct node
{
    int val,lazy;
} tree[4*N];
int n,s,e,q,a[N],num[N],tail[N],h[N],p[N][18],cnt,rev[N],d[N],ans[N];
vector<ii> g[N],Q[N];
ii ed[N];
void down(int id,int l,int r)
{
    tree[id].val+=tree[id].lazy;
    if(l!=r)
    {
        tree[id*2].lazy+=tree[id].lazy;
        tree[id*2+1].lazy+=tree[id].lazy;
    }
    tree[id].lazy=0;
}
void update(int id,int l,int r,int u,int v,int val)
{
    down(id,l,r);
    if(l>v||r<u||l>r||u>v) return;
    if(l>=u&&r<=v)
    {
        tree[id].val+=val;
        if(l!=r)
        {
            tree[id*2].lazy+=val;
            tree[id*2+1].lazy+=val;
        }
        return;
    }
    int m=(l+r)/2;
    update(id*2,l,m,u,v,val);
    update(id*2+1,m+1,r,u,v,val);
    tree[id].val=min(tree[id*2].val,tree[id*2+1].val);
}
int get(int id,int l,int r,int u,int v)
{
    down(id,l,r);
    if(l>v||r<u||l>r||u>v) return LLONG_MAX;
    if(l>=u&&r<=v) return tree[id].val;
    int m=(l+r)/2;
    return min(get(id*2,l,m,u,v),get(id*2+1,m+1,r,u,v));
}
void dfs(int u,int pre)
{
    num[u]=++cnt;
    rev[cnt]=u;
    h[u]=h[pre]+1;
    p[u][0]=pre;
    for(int i=1;i<=17;i++) p[u][i]=p[p[u][i-1]][i-1];
    for(ii v : g[u])
    {
        if(v.x==pre) continue;
        d[v.x]=d[u]+v.y;
        dfs(v.x,u);
    }
    tail[u]=cnt;
}
int lca(int u,int v)
{
    if(h[u]<h[v]) swap(u,v);
    for(int i=17;i>=0;i--)
    {
        if(h[p[u][i]]>=h[v]) u=p[u][i];
    }
    if(u==v) return u;
    for(int i=17;i>=0;i--)
    {
        if(p[u][i]!=p[v][i])
        {
            u=p[u][i];
            v=p[v][i];
        }
    }
    return p[u][0];
}
void reroot(int u,int pre)
{
//    cout<<u<<'\n';
//    for(int i=1;i<=s;i++) cout<<get(1,1,s,i,i)<<' ';
//    cout<<'\n';
    for(ii c : Q[u])
    {
        int cur=ed[c.x].x;
//        if(u==5)cout<<cur<<' ';
        if(lca(u,cur)!=cur) ans[c.y]=-1;
        else
        {
            int l=lower_bound(a+1,a+s+1,num[cur])-a;
            int r=upper_bound(a+1,a+s+1,tail[cur])-a-1;
            if(l>r) ans[c.y]=-2;
            else ans[c.y]=get(1,1,s,l,r);
        }
    }
    for(ii v : g[u])
    {
        if(v.x==pre) continue;
        int l=lower_bound(a+1,a+s+1,num[v.x])-a;
        int r=upper_bound(a+1,a+s+1,tail[v.x])-a-1;
//        if(v.x==3)  cout<<num[3]<<' '<<l<<' '<<r<<'\n';
        update(1,1,s,1,s,v.y);
        update(1,1,s,l,r,-2*v.y);
        reroot(v.x,u);
        update(1,1,s,1,s,-v.y);
        update(1,1,s,l,r,2*v.y);
    }
}
signed main()
{
    if(fopen("demo.inp","r"))
    {
        freopen("demo.inp","r",stdin);
        freopen("demo.out","w",stdout);
    }
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    cin>>n>>s>>q>>e;
    for(int i=1;i<n;i++)
    {
        int u,v,w;
        cin>>u>>v>>w;
        ed[i]={u,v};
        g[u].pb({v,w});
        g[v].pb({u,w});
    }
    dfs(e,0);
    for(int i=1;i<n;i++)
    {
        if(h[ed[i].x]<h[ed[i].y]) swap(ed[i].y,ed[i].x);
    }
    for(int i=1;i<=s;i++) {cin>>a[i]; a[i]=num[a[i]];}
//    cout<<upper_bound(a+1,a+s+1,3)-a-1;
//    return 0;
    sort(a+1,a+s+1);
    for(int i=1;i<=s;i++) update(1,1,s,i,i,d[rev[a[i]]]);
    for(int i=1;i<=q;i++)
    {
        int k,r;
        cin>>k>>r;
        Q[r].pb({k,i});
    }
    reroot(e,0);
    for(int i=1;i<=q;i++)
    {
        if(ans[i]==-1) cout<<"escaped\n";
        else if(ans[i]==-2) cout<<"oo\n";
        else cout<<ans[i]<<'\n';
    }
}

Compilation message (stderr)

valley.cpp: In function 'int main()':
valley.cpp:124:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  124 |         freopen("demo.inp","r",stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
valley.cpp:125:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  125 |         freopen("demo.out","w",stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...