Submission #1352615

#TimeUsernameProblemLanguageResultExecution timeMemory
1352615AvianshMigration Plan (JOI25_migration)C++20
42 / 100
2657 ms409528 KiB
#include <bits/stdc++.h>

using namespace std;
int tim = 0;
void dfs(int st, vector<int>g[], int dep[], int tin[], int tout[]){
    tin[st]=++tim;
    for(int i : g[st]){
        dep[i]=dep[st]+1;
        dfs(i,g,dep,tin,tout);
    }
    tout[st]=tim;
}

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 dep[n];
    int tin[n];
    int tout[n];
    dep[0]=0;
    dfs(0,g,dep,tin,tout);
    set<array<int,2>>sums[n];
    for(int i = 0;i<n;i++){
        sums[dep[i]].insert({tin[i],k[i]});
    }
    int q;
    cin >> q;
    while(q--){
        int t;
        cin >> t;
        if(t==1){
            int x,y;
            cin >> x >> y;
            if(sums[x].size()>sums[y].size()){
                swap(sums[x],sums[y]);
            }
            for(array<int,2>a:sums[x]){
                sums[y].insert(a);
            }
            sums[x].clear();
        }
        else if(t==2){
            int a,l;
            cin >> a >> l;
            a--;
            sums[dep[a]].insert({tin[a],l});
        }
        else{
            int i;
            cin >> i;
            i--;
            auto it = sums[dep[i]].lower_bound({tin[i],-1});
            int sum = 0;
            while(it!=sums[dep[i]].end()&&(*it)[0]<=tout[i]){
                sum+=(*it)[1];
                sums[dep[i]].erase(it);
                it = sums[dep[i]].lower_bound({tin[i],-1});
            }
            sums[dep[i]].insert({tin[i],sum});
            cout << sum << "\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...