#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
const int maxn = 100100;
int key[maxn],lef[maxn],sib[maxn],cnt[maxn],fa[maxn];
int get_fa(int x){
int p=x;
while(fa[x])x=fa[x];
while(p!=x){
int tmp=fa[p];
fa[p]=x;
p=tmp;
}
return x;
}
int top(int x){
int ans=-1,p;
while(x){
if(key[x]>ans){ans=key[x];p=x;}
x=sib[x];
}
return p;
}
void link(int x,int y){
sib[x]=lef[y];
lef[y]=x;
cnt[y]++;
}
int merge(int x,int y){
int tx=x,ty=y;
int p,q;
if(cnt[x]<=cnt[y]){p=x;x=sib[x];}
else {p=y;y=sib[y];}
q=p;
while(x&&y){
if(cnt[x]<=cnt[y]){sib[p]=x;x=sib[x];}
else {sib[p]=y;y=sib[y];}
p=sib[p];
}
if(x)sib[p]=x;
if(y)sib[p]=y;
p=q;
int pre=0;
int next=sib[p];
while(next){
if(cnt[p]!=cnt[next]||
(sib[next]&&cnt[p]==cnt[sib[next]])){
pre=p;
p=next;
}else if(key[p]>=key[next]){
sib[p]=sib[next];
link(next,p);
}else{
if(pre==0)q=next;
else sib[pre]=next;
link(p,next);
p=next;
}
next=sib[p];
}
fa[tx]=fa[ty]=q;
fa[q]=0;
return q;
}
void maintain(int x){
if(!x)return ;
int p=0,ret=-1;
for(int i=lef[x];i;i=sib[i]){
if(key[i]>ret){
p=i;
ret=key[i];
}
}
if(ret>key[x]){
swap(key[p],key[x]);
maintain(p);
}
}
int main() {
int n;
while(~scanf("%d",&n)){
for(int i=1;i<=n;i++){
scanf("%d",&key[i]);
lef[i]=sib[i]=cnt[i]=fa[i]=0;
}
int m;
scanf("%d",&m);
for(int i=0;i<m;i++){
int a,b;
scanf("%d%d",&a,&b);
int x=get_fa(a);
int y=get_fa(b);
if(x==y)printf("-1\n");
else{
int p=top(x);
int q=top(y);
key[p]/=2;
key[q]/=2;
maintain(p);maintain(q);
printf("%d\n",key[top(merge(x,y))]);
}
}
}
}
hdu1512 二项堆
最新推荐文章于 2018-08-03 21:28:37 发布