// I may fail a thousand times
// But there is no giving up
// IOI - here I come
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=2e5;
int n,m,a[N+5],sum[N+5],sz[N+5],par[N+5],lvl[N+5];
vector<int> g[N+5],nodes[25];
set<pair<int,int>> s[25];
struct bit{
	int n;
	vector<int> a;
	bit(int n){
		this->n=n;
		a.resize(n+1);
	}
	void upd(int v,int val){
		for(;v<=n;v+=v&-v)a[v]+=val;
	}
	int qry(int v){
		int ret=0;
		for(;v;v-=v&-v)ret+=a[v];
		return ret;
	}
};
int check_bamboo(){
	for(int i=1;i<=n;i++)if((int)g[i].size()>2)return 0;
	return 1;
}
void dfs_bamboo(int v,int p,vector<int> &bamboo){
	bamboo.push_back(v);
	for(int u:g[v]){
		if(u==p)continue;
		dfs_bamboo(u,v,bamboo);
	}
}
void solve_bamboo(){
	int root=1;
	for(int i=1;i<=n;i++)if((int)g[i].size()<=1)root=i;
	bit tree(N);
	vector<int> bamboo(1);
	vector<int> ind(n+1);
	dfs_bamboo(root,root,bamboo);
	for(int i=1;i<=n;i++)ind[bamboo[i]]=i;
	for(int i=1;i<=n;i++)tree.upd(i,a[bamboo[i]]);
	int lo=1,hi=n;
	int res=1;
	for(;lo<=hi;){
		int mi=(lo+hi)>>1;
		if(2*tree.qry(mi)>=tree.qry(n)){
			res=mi;
			hi=mi-1;
		}else{
			lo=mi+1;
		}
	}
	cout<<bamboo[res]<<'\n';
	for(int i=1;i<=m;i++){
		int z,b;cin>>z>>b;
		tree.upd(ind[b],z);
		int lo=1,hi=n;
		int res=1;
		for(;lo<=hi;){
			int mi=(lo+hi)>>1;
			if(2*tree.qry(mi)>=tree.qry(n)){
				res=mi;
				hi=mi-1;
			}else{
				lo=mi+1;
			}
		}
		cout<<bamboo[res]<<'\n';
	}
}
void dfs_regular(int v,int p){
	sz[v]=a[v];
	sum[v]=0;
	for(int u:g[v]){
		if(u==p)continue;
		dfs_regular(u,v);
		sz[v]+=sz[u];
		sum[v]+=sum[u]+sz[u];
	}
}
void reroot(int v,int p,int &ans,int &ind){
	if(ans>sum[v]){
		ind=v;
		ans=sum[v];
	}else if(ans==sum[v]){
		ind=min(ind,v);
	}
	for(int u:g[v]){
		if(u==p)continue;
		int tmp=sum[v]-sum[u]-sz[u];
		int tmp2=tmp+sz[v]-sz[u];
		int tmp3=sz[v]-sz[u];
		sum[u]+=tmp2;
		sz[u]+=tmp3;
		reroot(u,v,ans,ind);
		sz[u]-=tmp3;
		sum[u]-=tmp2;
	}
}
void solve_regular(){
	int ans=1e18,ind=0;
	dfs_regular(1,1);
	reroot(1,1,ans,ind);
	cout<<ind<<'\n';
}
void dfs_furthest(int v,int p,int cur,int &root,int &dist){
	if(dist<=cur){
		dist=cur;
		root=v;
	}
	par[v]=p;
	for(int u:g[v]){
		if(u==p)continue;
		dfs_furthest(u,v,cur+1,root,dist);
	}
}
void dfs_binary(int v,int p,int d,int root){
	lvl[v]=d;
	sum[root]+=d*a[v];
	sz[v]=a[v];
	nodes[d].push_back(v);
	for(int u:g[v]){
		if(u==p)continue;
		dfs_binary(u,v,d+1,root);
		sz[v]+=sz[u];
		par[u]=v;
	}
}
void solve_binary(){
	int root=1;
	for(int i=1;i<=n;i++){
		if((int)g[i].size()==2){
			root=i;
		}
	}
	int f1=root,f2=root,d1=0,d2=0;
	dfs_furthest(g[root][0],root,0,f1,d1);
	dfs_furthest(g[root][1],root,0,f2,d2);
	vector<int> diam1,diam2;
	for(;f1!=root;){
		diam1.push_back(f1);
		f1=par[f1];
	}
	diam1.push_back(root);
	for(;f2!=root;){
		diam2.push_back(f2);
		f2=par[f2];
	}
	for(int i=(int)diam2.size()-1;i>=0;i--){
		diam1.push_back(diam2[i]);
	}
	root=diam1[(int)diam1.size()/2];
	if((int)g[root].size()!=2)root=diam1[(int)diam1.size()/2-1];
	dfs_binary(root,root,0,root);
	for(int i=1;i<25;i++){
		for(int j:nodes[i]){
			sum[j]=sum[par[j]]-2*sz[j];
			if(i==1)sum[j]-=sum[par[j]];
			s[i].insert({sum[j],j});
		}
	}
	pair<int,int> res={sum[root],root};
	for(int j=1;j<25;j++){
		if(s[j].empty())continue;
		auto it=*s[j].begin();
		res=min(res,{it.first+j*sz[root]+sum[root],it.second});
	}
	cout<<res.second<<'\n';
	for(int i=1;i<=m;i++){
		int z,b;cin>>z>>b;
		sum[root]+=z*lvl[b];
		sz[root]+=z;
		for(;b!=root;){
			s[lvl[b]].erase({sum[b],b});
			sum[b]-=2*z*lvl[b];
			s[lvl[b]].insert({sum[b],b});
			b=par[b];
		}
		pair<int,int> res={sum[root],root};
		for(int j=1;j<25;j++){
			if(s[j].empty())continue;
			auto it=*s[j].begin();
			res=min(res,{it.first+j*sz[root]+sum[root],it.second});
		}
		cout<<res.second<<'\n';
	}
}
void solve(){
	cin>>n;
	for(int i=1;i<n;i++){
		int u,v;cin>>u>>v;
		g[u].push_back(v);
		g[v].push_back(u);
	}
	for(int i=1;i<=n;i++)cin>>a[i];
	cin>>m;
	if(m==0){
		solve_regular();
	}else if(check_bamboo()){
		solve_bamboo();
	}else{
		solve_binary();
	}
}
signed main(){
	ios_base::sync_with_stdio(0);
	cin.tie(0);
	int t=1;
	for(;t;t--){
		solve();
	}
	return 0;
}