RT.
第一条语句执行前就挂了
#include <bits/stdc++.h>
using namespace std;
const int maxn=1e5+5;
int n,m;
struct Node
{
int ls,rs;
int dist,val,ord;
bool operator > (const Node& b)const
{
if(val==b.val)return ord>b.ord;
return val>b.val;
}
}tree[maxn];
int root[maxn];
int del[maxn];
int merge(int x,int y)
{
if(!x||!y)return x+y;
if(tree[x]>tree[y])swap(x,y);
tree[x].rs=merge(tree[x].rs,y);
if(tree[tree[x].ls].dist<tree[tree[x].rs].dist)
{
swap(tree[x].ls,tree[x].rs);
}
tree[x].dist=tree[tree[x].rs].dist+1;
return x;
}
int find(int x)
{
return root[x]==x?x:root[x]=find(root[x]);
}
int main()
{
scanf("%d%d",&n,&m);
// printf("(%d,%d)\n",n,m);
for(int i=1;i<=n;i++)
{
scanf("%d",&tree[i].val);
tree[i].ord=i;
root[i]=i;
}
int op,x,y;
for(int i=1;i<=m;i++)
{
scanf("%d%d",&op,&x);
// printf("i: %d (%d,%d)\n",i,op,x);;
if(op==1)
{
scanf("%d",&y);
if(del[x]||del[y])continue;
int findx=find(x);
int findy=find(y);
if(findx==findy)continue;
root[x]=root[y]=merge(findx,findy);
}
if(op==2)
{
if(del[x])
{
puts("-1");
continue;
}
int findx=find(x);
printf("%d\n",tree[findx].val);
del[findx]=1;
root[findx]=merge(tree[findx].ls,tree[findx].rs);
tree[findx].ls=tree[findx].rs=tree[findx].dist=0;
}
}
return 0;
}