Submission #1343191

#TimeUsernameProblemLanguageResultExecution timeMemory
1343191vjudge1Fireworks (APIO16_fireworks)C++20
100 / 100
233 ms16864 KiB
#include<bits/stdc++.h>
using namespace std;
const int N = 1e6;
int ch[N][2],rt[N],dis[N],p[N],c[N],deg[N],CC;
long long val[N];
int merge(int a,int b){
    if(!a||!b)return a+b;
    if(val[a]<val[b])swap(a,b);
    ch[a][1]=merge(ch[a][1],b);
    if(dis[ch[a][1]]>dis[ch[a][0]])
        swap(ch[a][1],ch[a][0]);
    dis[a]=dis[ch[a][1]]+1;
    return a;
}
void pop(int x){
    rt[x]=merge(ch[rt[x]][0],ch[rt[x]][1]);
}
int main(){
    cin.tie(0)->sync_with_stdio(0);
    int n,m;
    long long ans=0;
    cin>>n>>m;
    for(int i=2;i<=n+m;i++)
        cin>>p[i]>>c[i],deg[p[i]]++,ans+=c[i];
    for(int i=n+m;i>1;i--){
        long long l=0,r=0;
        if(deg[i]) {
            while(--deg[i])
                pop(i);
            r=val[rt[i]];
            pop(i);
            l=val[rt[i]];
            pop(i);
        }
        val[++CC]=l+c[i],val[++CC]=r+c[i];
        rt[i]=merge(rt[i],merge(CC,CC-1));
        rt[p[i]]=merge(rt[p[i]],rt[i]);
    }
    while(deg[1]--)
        pop(1);
    while(rt[1])
        ans-=val[rt[1]],pop(1);
    cout<<ans<<'\n';
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...