1. 程式人生 > >hdu1512 左偏樹(可並堆)

hdu1512 左偏樹(可並堆)

#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; }