#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<string.h>
struct node{
int v,l,r;
};
struct node a[100000+10];
int m,n,f[100000+10],dist[100000+10];
int mg(int x,int y){
if(x==0)return y;
if(y==0)return x;
if(a[y].v>a[x].v){
int tmp;tmp=x;x=y;y=tmp;
}
a[x].r=mg(a[x].r,y);
f[a[x].r]=x;
if(a[x].r==0)dist[x]=0;
else dist[x]=dist[a[x].r]+1;
if(dist[a[x].r]>dist[a[x].l]){
int tmp;
tmp=a[x].r;a[x].r=a[x].l,a[x].l=tmp;
}
return x;
}
int find(int x){
if(f[x]==x)return x;
else return f[x]=find(f[x]);
}
int main(){
while(scanf("%d",&n)!=EOF){
for(int i=1;i<=n;i++)a[i].l=a[i].r=0;
for(int i=1;i<=n;i++)f[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,fy;
fx=find(x);fy=find(y);
if(fx==fy){
printf("-1\n");continue;
}
int tmp;
a[fx].v/=2;
tmp=mg(a[fx].l,a[fx].r);
a[fx].r=a[fx].l=0;
int nx=mg(tmp,fx);
a[fy].v/=2;
tmp=mg(a[fy].l,a[fy].r);
a[fy].r=a[fy].l=0;
int ny=mg(tmp,fy);
tmp=mg(nx,ny);
f[nx]=f[ny]=tmp;
printf("%d\n",a[tmp].v);
}
}
}
HDU1512 可并堆
最新推荐文章于 2019-01-18 16:55:08 发布