#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
struct node{
int v,l,r;
}a[100001];
int fa[100001];
int find(int x){
while(fa[x]!=x)
x=fa[x];
return x;
}
int hb(int x,int y){
if(x==0) return y;
if(y==0) return x;
if(a[y].v>a[x].v)swap(x,y);
a[x].r=hb(a[x].r,y);
fa[a[x].r]=x;
if(a[x].r>a[x].l) swap(a[x].r,a[x].l);
//if(a[x].r)a[x].dis=a[a[x].r].dis+1;
return x;
}
int main(){
int i,j,k,m,n;
while(~scanf("%d",&n)){
for(int i=1;i<=n;i++)a[i].l=a[i].r=0;
for(int i=1;i<=n;i++)fa[i]=i;
for(int i=1;i<=n;i++) scanf("%d",&a[i].v);
scanf("%d",&m);
for(int i=1;i<=m;i++){
int x,y;
scanf("%d %d",&x,&y);
int fx=find(x),fy=find(y);
if(fx==fy){
printf("-1\n");
continue;
}
a[fx].v/=2;
int tmp1=hb(a[fx].l,a[fx].r);
a[fx].l=a[fx].r=0;
int na1=hb(tmp1,fx);
a[fy].v/=2;
int tmp2=hb(a[fy].l,a[fy].r);
a[fy].l=a[fy].r=0;
int na2=hb(tmp2,fy);
int tmp3=hb(na1,na2);
fa[na1]=fa[na2]=tmp3;
printf("%d\n",a[tmp3].v);
}
}
return 0;
}
猴子大王 可并堆
最新推荐文章于 2018-04-12 14:38:03 发布