hdu 1512Monkey King 左偏树

来源:互联网 发布:淘宝店如何做代销 编辑:程序博客网 时间:2024/04/30 15:28
#include<stdio.h>

struct node
{
    
    int v;
    int l;
    int r;
    int f;
    int dis;
    
}o[100010];

int find(int n)
{
    
    while (o[n].f!=n) n=o[n].f;
    return n;
    
}

int mer(int a,int b)

{
    
    if (a==0) return b;
    if (b==0) return a;
    int t;
    
    if (o[a].v<o[b].v) {
        t=a;a=b;b=t;
    }
    
    o[a].r=mer(o[a].r,b);
    int ll=o[a].l,rr=o[a].r;
    o[rr].f=a;
    
    if (o[ll].dis<o[rr].dis) {
        t=o[a].l;o[a].l=o[a].r;o[a].r=t;
    }
    
    if (o[a].r==0) o[a].dis=0; else o[a].dis=o[o[a].r].dis+1;
    
    return a;
    
}

int droot(int n)
{
    
    int ll=o[n].l,rr=o[n].r;
    o[ll].f=ll;
    o[rr].f=rr;
    o[n].l=0;o[n].r=0;o[n].dis=0;
    return mer(ll,rr);

}

void mix(int a,int b)
{

    o[a].v/=2;
    o[b].v/=2;
    int ll=droot(a),rr=droot(b);
    ll=mer(ll,a);
    rr=mer(rr,b);
    ll=mer(ll,rr);
    printf("%d\n",o[ll].v);
    
}

int main()
{
    
    int i,x,y,a,b,n,m;
    
    while (~scanf("%d",&n)) {
    for (i=1;i<=n;i++) {
        scanf("%d",&o[i].v);
        o[i].f=i;
        o[i].l=0;
        o[i].r=0;
        o[i].dis=0;
    }
    
    scanf("%d",&m);
    for (i=1;i<=m;i++) {
        scanf("%d%d",&x,&y);
        a=find(x);b=find(y);
        if (a==b) printf("-1\n"); else {
            mix(a,b);
        }
    }
    }
    return 0;
}
1 0
原创粉丝点击