首页 > 代码库 > 左偏树

左偏树

BZOJ1455

#include <cstdio>

  int fa[1000001],a[1000001],n,root[1000001],die[1000001];
  
  struct treenode{
      int lc,rc,po,dis;
  }tr[1000001];

  int getfa(int po){
      int t=po;
      while (fa[t]!=t) t=fa[t];
      
      int root=t;
      while (fa[po]!=po){
        t=fa[po];
        fa[po]=root;
        po=t;
    }
    return(root);
  }
 
  int merge(int x,int y){
    if (x==0) return(y);
    if (y==0) return(x);
    if (a[tr[x].po]>a[tr[y].po]){
      int t=x;x=y;y=t;
    }
    tr[x].rc=merge(tr[x].rc,y);
    if (tr[tr[x].lc].dis<tr[tr[x].rc].dis){
      int t=tr[x].lc;tr[x].lc=tr[x].rc;tr[x].rc=t;
    }    
    tr[x].dis=tr[tr[x].rc].dis+1;
    return(x);
  }
  
  int main(){
      scanf("%d",&n);tr[0].dis=-1;
      for (int i=1;i<=n;i++){
        scanf("%d",&a[i]);
        tr[i].po=i;
      fa[i]=i;root[i]=i;
    }
    int m;
    scanf("%d",&m);
    for (int i=1;i<=m;i++){
      char st[2];int t1,t2;
      scanf("%s",&st);
      if (st[0]==M){
          scanf("%d%d",&t1,&t2);
          if (die[t1]||die[t2]) continue;
          t1=getfa(t1),t2=getfa(t2);
          if (t1==t2) continue;
          fa[t1]=t2;
          root[t2]=merge(root[t1],root[t2]);
      }else{
          scanf("%d",&t1);
          if (die[t1]){printf("0\n");continue;}
          t1=getfa(t1);
          printf("%d\n",a[tr[root[t1]].po]);
          die[tr[root[t1]].po]=1;
          root[t1]=merge(tr[root[t1]].lc,tr[root[t1]].rc);
      }
    }
  }

 

左偏树