제출 #1352490

#제출 시각아이디문제언어결과실행 시간메모리
1352490AvianshMigration Plan (JOI25_migration)C++20
8 / 100
226 ms30876 KiB
#include <bits/stdc++.h>

using namespace std;

void dfs(int st, vector<int>g[], int dep[]){
    for(int i : g[st]){
        dep[i]=dep[st]+1;
        dfs(i,g,dep);
    }
}

signed main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    int n;
    cin >> n;
    int p[n];
    p[0]=-1;
    vector<int>g[n];
    for(int i = 1;i<n;i++){
        cin >> p[i];
        p[i]--;
        g[p[i]].push_back(i);
    }
    int k[n];
    for(int &i : k)
        cin >> i;
    int q;
    cin >> q;
    int dep[n];
    dep[0]=0;
    dfs(0,g,dep);
    if(n<=20){
        while(q--){
            int t;
            cin >> t;
            if(t==1){
                int x,y;
                cin >> x >> y;
                for(int i = 0;i<n;i++){
                    if(dep[i]==x){
                        int temp = i;
                        while(dep[temp]!=y){
                            temp=p[temp];
                        }
                        k[temp]+=k[i];
                        k[i]=0;
                    }
                }
            }
            else if(t==2){
                int a,l;
                cin >> a >> l;
                a--;
                k[a]+=l;
            }
            else{
                int i;
                cin >> i;
                i--;
                cout << k[i] << "\n";
            }
        }
    }
    else{
        ///assume d=1
        int sum = 0;
        for(int i = 0;i<n;i++){
            sum+=k[i];
        }
        int tim[n];
        fill(tim,tim+n,q);
        int t = q+1;
        while(q--){
            int typ;
            cin >> typ;
            if(typ==1){
                int x,y;
                cin >> x >> y;
                k[0]=sum;
                t=q;
            }
            else if(typ==2){
                int a,l;
                cin >> a >> l;
                a--;
                if(tim[a]>t){
                    k[a]=0;
                }
                tim[a]=q;
                sum+=l;
                k[a]+=l;
            }
            else{
                int i;
                cin >> i;
                i--;
                if(tim[i]>t){
                    k[i]=0;
                }
                tim[i]=q;
                cout << k[i] << "\n";
            }
        }
    }
    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...