#include <iostream>
#include <cstring>
#include <cstdio>
#include<cmath>
using namespace std;
const int N= 1e5+10;
typedef long long LL;
struct node{
int l,r,dis,val,dad;
}heap[N<<2];
inline int max(const int &a,const int &b){
return a>b?a:b;
}
inline void swap(int &a,int &b){
a^=b^=a^=b;
}
inline int find(int &x){
return heap[x].dad==x?x:heap[x].dad=find(heap[x].dad);
}
int merge(int x,int y){
if(x==0) return y;
if(y==0) return x;
if(heap[x].val<heap[y].val) swap(x,y);
heap[x].r = merge(heap[x].r,y);
heap[heap[x].r].dad = x;
if(heap[heap[x].l].dis<heap[heap[x].r].dis) swap(heap[x].l,heap[x].r);
if(heap[x].r==0) heap[x].dis = 0;
else heap[x].dis = heap[heap[x].r].dis+1;
return x;
}
inline int pop(int &x){
int l = heap[x].l;
int r = heap[x].r;
heap[l].dad = l;
heap[r].dad = r;
heap[x].dis = heap[x].l = heap[x].r = 0;
return merge(l,r);
}
inline int push(int x,int y){
return merge(x,y);
}
int main(){
int num, que;
while(scanf("%d",&num)==1){
for(int i=1;i<=num;i++){
scanf("%d",&heap[i].val);
heap[i].l=heap[i].r=heap[i].dis=0;
heap[i].dad= i ;
}
scanf("%d",&que);
int a,b,x,y;
while(que--){
scanf("%d%d",&a,&b);
x = find(a);
y = find(b);
if(x==y) puts("-1");
else{
heap[x].val/=2;
int xx = pop(x);
xx = push(xx,x);
heap[y].val/=2;
int yy = pop(y);
yy = push(yy,y);
int tmp = merge(yy,xx);
printf("%d\n",heap[tmp].val);
}
}
}
return 0;
}
hdu1512 左偏树(可并堆)
最新推荐文章于 2020-05-02 21:00:00 发布