QAQ可能是我理解还不够透彻
只能A一个点,剩下都是WA
求调!
#include <bits/stdc++.h>
using namespace std;
//Start define.
namespace MySpace{
#define max(a,b) (a>b?a:b)
#define min(a,b) (a<b?a:b)
#define lowbit(x) (x&(-x))
template <typename T>
inline T read(){
register T now=0,nev=1;
register char c=getchar();
while(c<'0' || c>'9') {
if(c=='-') nev=-1;
c=getchar();
}
while(c>='0' && c<='9') now=(now<<1)+(now<<3)+(c&15),c=getchar();
return now*nev;
}
template<typename T>
T qpow(T a,T n,T p){
T res=1;
while (n){
if (n&1) res=1ll*res*a%p;
a=1ll*a*a%p;
n>>=1;
}
return res;
}
template<typename T>
T gcd(T a,T b){return (b>0?gcd(b,a%b):a);}
}
using namespace MySpace;
#define ndbg
//const int INF=0x66CCFF66;
const int maxn=1e6+5;
#define ls(x) tr[x].Ls
#define rs(x) tr[x].Rs
#define dis(x) tr[x].Dis
#define val(x) tr[x].Val
int n;
int opt,x;
int cnt;
int root=1;
struct node{
int Ls,Rs;
int Dis,Val;
}tr[maxn];
int merge(int x,int y){
#ifdef dbg
printf("x: %d y: %d\n",x,y);
#endif
if (!x||!y) return x+y;
if (val(x)>val(y)) swap(x,y);
rs(x)=merge(rs(x),y);
if(dis(ls(x))<dis(rs(x))) swap(ls(x),rs(x));
dis(x)=dis(rs(x))+1;
return x;
}
void pop(int& x){
val(x)=-1;
x=merge(ls(x),rs(x));
return;
}
int main(){
n=read<int>();
dis(0)=-1;
while(n--){
opt=read<int>();
if (opt==1){
x=read<int>();
val(++cnt)=x;
if (cnt!=1) merge(root,cnt);
}else if (opt==2){
printf("%d\n",val(root));
}else{
if (root && val(root)!=-1) pop(root);
}
}
return 0;
}