以前都是靠模板的,只能说现场只能水点分了....
#include<iostream>
#include<cmath>
using namespace std;
struct node
{
int v,h;
node* lc;
node* rc;
node(int _v):v(_v),lc(NULL),rc(NULL),h(0){}
};
int getHeight(node* rt)
{
if(rt!=NULL)return rt->h;
else return -1;
}
int balance(node* rt)
{
return abs(getHeight(rt->lc)-getHeight(rt->rc))<2;
}
node* rotate_LL(node* rt)
{
node* child = rt->lc;
rt->lc = child->rc;
child->rc = rt;
rt->h = max(getHeight(rt->lc),getHeight(rt->rc))+1;
child->h = max(getHeight(child->lc),getHeight(child->rc))+1;
return child;
}
node* rotate_RR(node* rt)
{
node* child = rt->rc;
rt->rc = child->lc;
child->lc = rt;
rt->h = max(getHeight(rt->lc),getHeight(rt->rc))+1;
child->h = max(getHeight(child->lc),getHeight(child->rc))+1;
return child;
}
node* rotate_LR(node* rt)
{
node* child = rt->lc;
rt->lc = rotate_RR(child);
return rotate_LL(rt);
}
node* rotate_RL(node* rt)
{
node* child = rt->rc;
rt->rc = rotate_LL(child);
return rotate_RR(rt);
}
node* insert(node* rt,int x)
{
if(rt!=NULL)
{
if(x>rt->v)
{
rt->rc = insert(rt->rc,x);
if(!balance(rt))
{
if(x>rt->rc->v)rt = rotate_RR(rt);
else rt = rotate_RL(rt);
}
}
else
{
rt->lc = insert(rt->lc,x);
if(!balance(rt))
{
if(x<rt->lc->v)rt = rotate_LL(rt);
else rt = rotate_LR(rt);
}
}
}
else rt = new node(x);
rt->h = max(getHeight(rt->lc),getHeight(rt->rc))+1;
return rt;
}
int main()
{
int n,x;
cin>>n;
node *rt = NULL;
for(int i = 1;i<=n;i++)
{
cin>>x;
rt = insert(rt,x);
}
cout<<rt->v<<endl;
return 0;
}