左偏树HDU 1512 ( Monkey King )
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
#define maxn 200000
struct node{    
    int l,r,val,dis,f;
}t[maxn];
int merge(int a,int b){
    if(!a)return b;
    if(!b)return a;
    if(t[a].val<t[b].val)swap(a,b);
    t[a].r=merge(t[a].r,b);
    t[t[a].r].f=a;
    if(t[t[a].l].dis<t[t[a].r].dis)swap(t[a].l,t[a].r);
    t[a].dis=t[t[a].r].dis+1;
    return a;
}
int find(int x){
    return t[x].f==x?x:find(t[x].f);
}
int n,m;
int pop(int x){
    int l=t[x].l,r=t[x].r;
    t[l].f=l,t[r].f=r;
    t[x].l=t[x].r=t[x].dis=0;
    return merge(l,r);
}
int main(){
    t[0].dis=-1;
    while(scanf("%d",&n)!=EOF){
    for(int i=1;i<=n;i++){
        int a;
        scanf("%d",&a);
        t[i].val=a;
        t[i].f=i;
        t[i].r=t[i].l=0;
    }    
    scanf("%d",&m);
    for(int i=1;i<=m;i++){
        int a,b;
        scanf("%d%d",&a,&b);
        int x=find(a),y=find(b);
        if(x==y){
            printf("-1\n");
            continue;
        }else{
            int i1=pop(x),i2=pop(y);
            t[x].val>>=1;
            t[y].val>>=1;
            i1=merge(x,i1);
            i2=merge(y,i2);
            printf("%d\n",t[merge(i1,i2)].val);
        }
        
    }
    
}}
 
                    
                     
                    
                 
                    
                
 
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号