左偏树模板题,注意删除根节点时要更新子节点a数组信息,注意此时根节点被删除成为一颗单独的树,所以不要修改根节点的fa数组信息。
#include<bits/stdc++.h>
using namespace std;
int fa[100005];
int find(int x){return x==fa[x]?x:fa[x]=find(fa[x]);}
struct node
{
int ls,rs,d,val;
}t[100005];
int merge(int x,int y)
{
if(!x||!y)return x+y;
if(t[x].val<t[y].val)swap(x,y);
t[x].rs=merge(t[x].rs,y);
if(t[t[x].rs].d>t[t[x].ls].d)swap(t[x].ls,t[x].rs);
t[x].d=t[t[x].rs].d+1;
fa[t[x].ls]=x,fa[t[x].rs]=x;
return x;
}
int del(int x)
{
int l=t[x].ls,r=t[x].rs;
t[x].ls=t[x].rs=0;
//t[x].d=0;
fa[l]=l,fa[r]=r;
return merge(l,r);
}
int main()
{
int n,m;
while(cin>>n)
{
memset(t,0,sizeof(t));
for(int i=1;i<=n;i++)
cin>>t[i].val,fa[i]=i;
cin>>m;
while(m--)
{
int x,y;
cin>>x>>y;
//cout<<"**"<<endl;
x=find(x),y=find(y);
if(find(x)==find(y)){cout<<"-1"<<endl;continue;}
t[x].val/=2,t[y].val/=2;
int newx=del(x);
newx=merge(x,newx);
int newy=del(y);
newy=merge(y,newy);
int newroot=merge(newx,newy);
//cout<<newx<<newy<<endl;
cout<<t[newroot].val<<endl;
}
}
return 0;
}