本来A了,然后包装一下变MLE了。
#include<bits/stdc++.h>
#define ll long long
#define N 100005
using namespace std;
namespace L_Tree{
struct Tree{
ll dis[N],key[N],l[N],r[N],fa[N],tot;
Tree() {for(int i=1;i<=N;i++) dis[i] = key[i] = l[i] = r[i] = 0 , fa[i] = i; tot = 0;}
inline void build_split(ll a[],ll n) {for(int i=1;i<=n;i++) key[++tot] = a[i];}
inline ll find(ll x) {return (x == fa[x] ? x : fa[x] = find(fa[x]));}
inline ll update(ll A,ll B){
if(!A || !B) return A + B;
if(key[A] > key[B]) swap(A , B);
r[A] = update(r[A] , B);
if(dis[r[A]] > dis[l[A]]) swap(l[A] , r[A]);
dis[A] = (r[A] ? dis[r[A]] + 1 : 0);
return A;
}
inline ll merge(ll A,ll B){
A = find(A) , B = find(B);
if(A != B) return fa[A] = fa[B] = update(A , B);
}
inline ll front(ll x) {x = find(x) ; return key[x];}
inline void pop(ll x) {x = find(x) ; fa[x] = fa[l[x]] = fa[r[x]] = update(l[x] , r[x]);}
inline void add(ll x,ll A) {key[++tot] = x ; A = find(A) ; merge(A , tot);}
inline void build_merge(ll a[],ll n) {
key[++tot] = a[1];
for(int i=2;i<=n;i++) add(a[i] , 1);
}
} ;
}
using namespace L_Tree;
ll n,m;
ll a[N];
bitset<N> vis;
int main(){
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>a[i];
Tree tr;
tr.build_split(a,n);
ll opt,x,y;
while(m--){
cin>>opt;
if(opt == 1){
cin>>x>>y;
if(vis[x] || vis[y]) continue;
tr.merge(x,y);
}
else{
cin>>x;
if(vis[x]) {cout<<-1<<endl;continue;}
vis[tr.find(x)] = 1;
cout<<tr.front(x)<<endl;
tr.pop(x);
}
}
return 0;
}
什么原理? thx。