STILL MAXIMUM HACKEREARTH

#include<bits/stdc++.h>
using namespace std;

int const N=1e5+3;
long long int arr[N]={0},size[N]={0}, minarr[N]={0},maxarr[N]={0}, localmax=0;



void initialise(int nodes){
    for(int i=0;i<=nodes;i++){
        arr[i]=i;
        size[i]=1;
    }
}

int root(int i){
    while(i!=arr[i]){
        i=arr[i];
    }
    return i;
}



void Union(int a,int  b){
    int root_a=root(a);
    int root_b=root(b);
    if(root_a==root_breturn;
    if(size[root_a]>size[root_b]){
        arr[root_b]=root_a;
        size[root_a]+=size[root_b];
        size[root_b]=0;
        minarr[root_a]=min(minarr[root_a],minarr[root_b]);
        maxarr[root_a]=max(maxarr[root_a],maxarr[root_b]);
        localmax=max(maxarr[root_a]-minarr[root_a],localmax);
    }
    else{
        arr[root_a]=root_b;
        size[root_b]+=size[root_a];
        size[root_a]=0;
        minarr[root_b]=min(minarr[root_a],minarr[root_b]);
        maxarr[root_b]=max(maxarr[root_a],maxarr[root_b]);
        localmax=max(maxarr[root_b]-minarr[root_b],localmax);
    }
}

int main() {
    int nodescin>>nodes;
    initialise(nodes);
    pair<intint> edges[nodes];
    int a,b;
    for(int i=1;i<=nodes-1;i++){
        cin>>a>>b;
        edges[i]={a,b};
    }
    long long int x;
    for(int i=1;i<=nodes;i++){
        cin>>x;
        maxarr[i]=x;
        minarr[i]=x;
    }
 
    stack<long long int> st;

    for(int i=1;i<=nodes-1;i++){
        cin>>x;
        st.push(x);
    }
    vector<long long int> ans;
    ans.push_back(0);
    for(int i=1;i<=nodes-2;i++){
        int p=st.top();
        st.pop();
        Union(edges[p].first,edges[p].second);
        ans.push_back(localmax);
    }
    reverse(ans.begin(),ans.end());
    for(int i=0;i<nodes-1;i++cout<<ans[i]<<"\n";
    return 0;
}

Comments