Submission #1133630

#TimeUsernameProblemLanguageResultExecution timeMemory
1133630CiprianMagic Tree (CEOI19_magictree)C++20
14 / 100
63 ms21292 KiB

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N=2e5;
int sgt[4*N];
vector<int>dp(N);
vector<vector<int>>dp1(3, vector<int>(N));
vector<int>day(N), w(N), adj[N];
void dfs(int x, int p){
    int sum1=0,sum2=0;
    for(auto e: adj[x]){
        if(e==p)continue;
        dfs(e,x);
        sum1+=dp1[1][e];
        sum2+=dp1[2][e];
    }if(day[x]==1){
        dp1[1][x]=sum1+w[x];
        dp1[2][x]=sum2;
    }else if(day[x]==2){
        dp1[1][x]=sum1;
        dp1[2][x]=max(sum2, sum1)+w[x];
    }else{
        dp1[1][x]=sum1;
        dp1[2][x]=sum2;
    }
}
void build(int i, int l, int r){
    if(l==r){
        sgt[i]=dp[l];
        return;
    }int mid=(l+r)/2;
    build(2*i, l, mid);
    build(2*i+1, mid+1, r);
    sgt[i]=max(sgt[2*i], sgt[2*i+1]);
    return;
}void updt(int i, int l, int r, int idx, int val){
    if(l<=idx && idx<=r){
        if(l==r && idx==l){
            sgt[i]=val;
            return;
        }int mid=(l+r)/2;
        updt(2*i, l, mid, idx,val);
        updt(2*i+1, mid+1, r, idx, val);
        sgt[i]=max(sgt[2*i], sgt[2*i+1]);
        return;
    }return;
}int find(int i,int l,int r, int tl, int tr){
    if(tl<=l && r<=tr){
        return sgt[i];
    }else if(tr<l || tl>r){
        return 0;
    }int mid=(l+r)/2;
    int a=find(2*i, l, mid, tl, tr);
    int b=find(2*i+1, mid+1, r, tl, tr);
    return max(a,b);
}
int32_t main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    int n, m,k;
    cin>>n>>m>>k;
    vector<int>p(n+2),deg(n+2);
    bool check1=true, check2=true;
    for(int i=2; i<=n; i++){
        cin>>p[i];
        if(p[i]!=i-1)check2=false;
        adj[p[i]].push_back(i);
        adj[i].push_back(p[i]);
        deg[p[i]]++;
    }int sum=0;
    
    
    
    
    for(int i=0; i<m; i++){
        int v,d,w1;
        cin>>v>>d>>w1;
        day[v]=d;
        w[v]=w1;
        if(deg[v]!=0)check1=false;
        sum+=w1;
    }if(check1)cout<<sum<<endl;
    else if(check2){
        build(1, 1, k);
        
        for(int i=n; i>=1; i--){
            if(day[i]!=0){
                dp[day[i]]=find(1, 1, k, 1, day[i])+1;
                updt(1, 1, k, day[i], dp[day[i]]);
                //cout<<day[i]<<" "<<dp[day[i]]<<endl;
            }
        }int mx=0;
        for(int i=1; i<=k; i++){
            mx=max(mx,dp[i]);
        }cout<<mx<<endl;
    }else{
        dfs(1, 1);
        cout<<max(dp1[1][1], dp1[2][1])<<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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...