#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <string>
#include <sstream>
#include <cstring>
#include <cctype>
#include <cmath>
#include <vector>
#include <set>
#include <map>
#include <stack>
#include <queue>
#include <ctime>
#include <cassert>
#define _for(i,a,b) for(int i=(a);i<(b);++i)
#define _rep(i,a,b) for(int i=(a);i<=(b);++i)
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;
typedef long long LL;
inline int read_int(){
    int t=0;bool sign=false;char c=getchar();
    while(!isdigit(c)){sign|=c=='-';c=getchar();}
    while(isdigit(c)){t=(t<<1)+(t<<3)+(c&15);c=getchar();}
    return sign?-t:t;
}
inline LL read_LL(){
    LL t=0;bool sign=false;char c=getchar();
    while(!isdigit(c)){sign|=c=='-';c=getchar();}
    while(isdigit(c)){t=(t<<1)+(t<<3)+(c&15);c=getchar();}
    return sign?-t:t;
}
inline char get_char(){
    char c=getchar();
    while(c==' '||c=='\n'||c=='\r')c=getchar();
    return c;
}
inline void write(LL x){
    register char c[21],len=0;
    if(!x)return putchar('0'),void();
    if(x<0)x=-x,putchar('-');
    while(x)c[++len]=x%10,x/=10;
    while(len)putchar(c[len--]+48);
}
inline void space(LL x){write(x),putchar(' ');}
inline void enter(LL x){write(x),putchar('\n');}
const int MAXN=1e5+5;
struct Left_Heap{
	int root[MAXN];
	struct Node{
		int id,val,dis,ch[2];
		bool operator < (const Node &b)const{return val>b.val||(val==b.val&&id<b.id);}
	}node[MAXN];
	void build(int *a,int n){
		node[0].dis=-1;
		_rep(i,1,n)
		node[i].id=root[i]=i,node[i].val=a[i],node[i].ch[0]=node[i].ch[1]=node[i].dis=0;
	}
	int find_root(int x){return x==root[x]?x:root[x]=find_root(root[x]);}
	void merge(int &k,int k1,int k2){
		if(!k1||!k2)return k=k1|k2,void();
		if(node[k2]<node[k1])swap(k1,k2);
		merge(node[k=k1].ch[1],node[k1].ch[1],k2);
		if(node[node[k].ch[0]].dis<node[node[k].ch[1]].dis)
		swap(node[k].ch[0],node[k].ch[1]);
		node[k].dis=node[node[k].ch[1]].dis+1;
	}
	int merge(int x,int y){
		int rt,p1=find_root(x),p2=find_root(y);
		if(p1==p2)return -1;
		update(p1);update(p2);
		p1=find_root(x),p2=find_root(y);
		merge(rt,p1,p2);
		root[p1]=root[p2]=rt;
		return node[rt].val;
	}
	void update(int rt){
		int temp,Root;
		merge(temp,node[rt].ch[0],node[rt].ch[1]);
		node[rt].val>>=1;node[rt].ch[0]=node[rt].ch[1]=node[rt].dis=0;
		merge(Root,temp,rt);
		root[Root]=root[rt]=Root;
	}
}heap;
int a[MAXN];
int main()
{
	int n,m,x,y;
	while(~scanf("%d",&n)){
		_rep(i,1,n)
		a[i]=read_int();
		heap.build(a,n);
		m=read_int();
		_rep(i,1,m){
			x=read_int(),y=read_int();
			enter(heap.merge(x,y));
		}
	}
    return 0;
}