#include<bits/stdc++.h>
using namespace std;
#define fore(i, l, r) for(int i = int(l); i < int(r); i++)
#define sz(a) int((a).size())
#define x first
#define y second
typedef long long li;
typedef long double ld;
typedef pair<int, int> pt;
template<class A, class B> ostream& operator <<(ostream& out, const pair<A, B> &p) {
return out << "(" << p.x << ", " << p.y << ")";
}
template<class A> ostream& operator <<(ostream& out, const vector<A> &v) {
fore(i, 0, sz(v)) {
if(i) out << " ";
out << v[i];
}
return out;
}
const int INF = int(1e9);
const li INF64 = li(1e18);
const ld EPS = 1e-9;
const int LOG = 18;
const int N = int(2e5) + 55;
int n;
vector<int> a;
vector<int> g[N];
inline bool read() {
if(!(cin >> n))
return false;
a.resize(n);
fore (i, 0, n)
cin >> a[i];
fore (i, 0, n - 1) {
int u, v;
cin >> u >> v;
u--, v--;
g[u].push_back(v);
g[v].push_back(u);
}
return true;
}
struct Lca {
vector<int> log2, tin;
vector< vector<int> > hs;
int T = 0;
void dfs(int v, int p, int cdepth) {
tin[v] = T++;
hs[0][tin[v]] = cdepth;
for (int to : g[v]) {
if (to == p)
continue;
dfs(to, v, cdepth + 1);
hs[0][T++] = cdepth;
}
}
void init() {
log2.assign(2 * n, 0);
fore (i, 2, sz(log2))
log2[i] = log2[i / 2] + 1;
hs.assign(log2.back() + 1, vector<int>(2 * n, INF));
tin.assign(n, 0);
T = 0;
dfs(0, -1, 0);
assert(T < 2 * n);
fore (pw, 0, sz(hs) - 1) {
fore (i, 0, T - (1 << pw))
hs[pw + 1][i] = min(hs[pw][i], hs[pw][i + (1 << pw)]);
}
}
int getMin(int u, int v) {
if (tin[u] > tin[v])
swap(u, v);
int len = log2[tin[v] + 1 - tin[u]];
int d = min(hs[len][tin[u]], hs[len][tin[v] + 1 - (1 << len)]);
// cerr << u << " " << v << ": " << d << endl;
return d;
}
inline int getH(int v) {
return hs[0][tin[v]];
}
} lcaST;
int getFarthest(int s) {
vector<int> used(n, 0);
queue<int> q;
used[s] = 1;
q.push(s);
int v;
while (!q.empty()) {
v = q.front();
q.pop();
for (int to : g[v]) {
if (used[to])
continue;
used[to] = 1;
q.push(to);
}
}
return v;
}
int getDist(int u, int v) {
return lcaST.getH(u) + lcaST.getH(v) - 2 * lcaST.getMin(u, v);
}
const int M = int(2e5);
vector<pt> ops[4 * M];
void setOp(int v, int l, int r, int lf, int rg, const pt &op) {
if (l >= r || lf >= rg) return;
if (l == lf && r == rg) {
ops[v].push_back(op);
return;
}
int mid = (l + r) / 2;
if (lf < mid)
setOp(2 * v + 1, l, mid, lf, min(mid, rg), op);
if (rg > mid)
setOp(2 * v + 2, mid, r, max(lf, mid), rg, op);
}
void updDiam(int &s, int &t, int &curD, const pt &op) {
int v = op.x;
a[v] = op.y;
int ns = s, nt = t, nD = curD;
vector<pt> cds = {{s, v}, {v, t}, {v, v}};
for (auto &c : cds) {
int d1 = getDist(c.x, c.y);
if (nD < a[c.x] + d1 + a[c.y]) {
nD = a[c.x] + d1 + a[c.y];
ns = c.x, nt = c.y;
}
}
s = ns;
t = nt;
curD = nD;
}
vector<int> ans;
void calcDiams(int v, int l, int r, int s, int t, int curD) {
for (auto &op : ops[v])
updDiam(s, t, curD, op);
if (r - l > 1) {
int mid = (l + r) / 2;
calcDiams(2 * v + 1, l, mid, s, t, curD);
calcDiams(2 * v + 2, mid, r, s, t, curD);
}
else
ans[l] = (curD + 1) / 2;
for (auto &op : ops[v])
a[op.first] = 0;
}
inline void solve() {
lcaST.init();
int s = getFarthest(0);
int t = getFarthest(s);
int m;
cin >> m;
vector<int> lst(n, 0);
fore (i, 0, m) {
int v, x;
cin >> v >> x;
v--;
setOp(0, 0, m, lst[v], i, {v, a[v]});
lst[v] = i;
a[v] = x;
}
fore (v, 0, n)
setOp(0, 0, m, lst[v], m, {v, a[v]});
ans.resize(m, -1);
a.assign(n, 0);
calcDiams(0, 0, m, s, t, getDist(s, t));
fore (i, 0, m)
cout << ans[i] << '\n';
}
int main() {
#ifdef _DEBUG
freopen("input.txt", "r", stdin);
int tt = clock();
#endif
ios_base::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
cout << fixed << setprecision(15);
if(read()) {
solve();
#ifdef _DEBUG
cerr << "TIME = " << clock() - tt << endl;
tt = clock();
#endif
}
return 0;
}