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_b) return;
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 nodes; cin>>nodes;
initialise(nodes);
pair<int, int> 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
Post a Comment