#include <iostream>
#include <cstring>
using namespace std;
const int N = 1e5 + 10;
int n, m, x, y;
int lc[N], rc[N], dist[N], fa[N];
bool tf[N];
struct node {
int id, v;
bool operator < (const node &x) {
if (v == x.v) return id < x.id;
return v < x.v;
}
} v[N];
int find (int x) {
if (fa[x] == x) return x;
else return fa[x] = find(fa[x]);
}
int merge (int x, int y) {
if (!x || !y) return x | y;
if (v[y] < v[x]) swap(x, y);
rc[x] = merge(rc[x], y);
if (dist[lc[x]] < dist[rc[x]]) swap(lc[x], rc[x]);
dist[x] = dist[rc[x]] + 1;
return x;
}
int weak (int x) {
v[x].v >>= 1;
int root = merge(lc[x], rc[x]);
lc[x] = rc[x] = dist[x] = 0;
return fa[root] = fa[x] = merge(root, x);
}
int main () {
while (cin >> n) {
dist[0] = -1;
for (int i = 1; i <= n; i ++) {
lc[i] = rc[i] = dist[i] = 0;
cin >> v[i].v;
fa[i] = v[i].id = i;
}
cin >> m;
for (int i = 1; i <= m; i ++) {
cin >> x >> y;
x = find(x);
y = find(y);
if (x == y) { cout << "-1\n"; continue; }
int a = weak(x), b = weak(y);
fa[a] = fa[b] = merge(a, b);
cout << v[fa[a]].v << '\n';
}
}
return 0;
}
样例过不去