Tree Construction

CodeForces - 675D

During the programming classes Vasya was assigned a difficult problem. However, he doesn't know how to code and was unable to find the solution in the Internet, so he asks you to help.

You are given a sequence a, consisting of n distinct integers, that is used to construct the binary search tree. Below is the formal description of the construction process.

  1. First element a1 becomes the root of the tree.
  2. Elements a2, a3, ..., an are added one by one. To add element ai one needs to traverse the tree starting from the root and using the following rules:
    1. The pointer to the current node is set to the root.
    2. If ai is greater than the value in the current node, then its right child becomes the current node. Otherwise, the left child of the current node becomes the new current node.
    3. If at some point there is no required child, the new node is created, it is assigned value ai and becomes the corresponding child of the current node.

Input

The first line of the input contains a single integer n (2 ≤ n ≤ 100 000) — the length of the sequence a.

The second line contains n distinct integers ai (1 ≤ ai ≤ 109) — the sequence aitself.

Output

Output n - 1 integers. For all i > 1 print the value written in the node that is the parent of the node with value ai in it.

Examples

Input
3
1 2 3
Output
1 2
Input
5
4 2 3 1 6
Output
4 2 2 4

Note

Picture below represents the tree obtained in the first sample.

Picture below represents the tree obtained in the second sample.

sol:一个很显然的性质就是当前这个点父亲的权值一定是他的前驱后者后继,但是怎么判断是前驱的右儿子或者后继的左儿子嫩?貌似有点蛋碎,挂了两次之后知道了是出现时间最晚的那个就是了,前驱后继写(copy)一个splay就可以了

#include <bits/stdc++.h>
using namespace std;
typedef int ll;
inline ll read()
{
ll s=;
bool f=;
char ch=' ';
while(!isdigit(ch))
{
f|=(ch=='-'); ch=getchar();
}
while(isdigit(ch))
{
s=(s<<)+(s<<)+(ch^); ch=getchar();
}
return (f)?(-s):(s);
}
#define R(x) x=read()
inline void write(ll x)
{
if(x<)
{
putchar('-'); x=-x;
}
if(x<)
{
putchar(x+''); return;
}
write(x/);
putchar((x%)+'');
return;
}
#define W(x) write(x),putchar(' ')
#define Wl(x) write(x),putchar('\n')
const int N=,inf=0x3f3f3f3f;
int n,a[N],b[N];
namespace Pht
{
int Points,Root;
int Child[N][];
int Parent[N];
int Quanzhi[N];
int Cnt[N];
int Size[N]; inline void Init();
inline int Check(int x);
inline void PushUp(int x);
inline void Rotate(int x);
inline void Splay(int At,int To);
inline void Insert(int Val);
inline void Remove(int Val);
inline void Find(int Val);
inline int Ask_Lower(int Val);
inline int Ask_Upper(int Val);
inline int Ask_Kth(int Id);
inline void Solve(); inline void Init()
{
Points=Root=;
Insert(-inf);
Insert(inf);
}
inline int Check(int x)
{
return (Child[Parent[x]][]==x)?:;
}
inline void PushUp(int x)
{
Size[x]=Size[Child[x][]]+Size[Child[x][]]+Cnt[x];
}
inline void Rotate(int x)
{
int y,z,oo;
y=Parent[x];
z=Parent[y];
oo=Check(x);
Child[y][oo]=Child[x][oo^]; Parent[Child[x][oo^]]=y;
Child[z][Check(y)]=x; Parent[x]=z;
Child[x][oo^]=y; Parent[y]=x;
PushUp(x); PushUp(y);
}
inline void Splay(int At,int To)
{
while(Parent[At]!=To)
{
int Father=Parent[At];
if(Parent[Father]==To)
{
Rotate(At);
}
else if(Check(At)==Check(Father))
{
Rotate(Father); Rotate(At);
}
else
{
Rotate(At); Rotate(At);
}
}
if(To==) Root=At;
}
inline void Insert(int Val)
{
int Now=Root,Par=;
while(Now&&(Quanzhi[Now]!=Val))
{
Par=Now;
Now=Child[Now][(Val>Quanzhi[Now])?:];
}
if(Now)
{
Cnt[Now]++; Size[Now]++;
}
else
{
Now=++Points;
if(Par)
{
Child[Par][(Val>Quanzhi[Par])?:]=Now;
}
Parent[Now]=Par;
Child[Now][]=Child[Now][]=;
Cnt[Now]=Size[Now]=;
Quanzhi[Now]=Val;
}
Splay(Now,);
}
inline void Remove(int Val)
{
int Lower=Ask_Lower(Val),Upper=Ask_Upper(Val);
Splay(Lower,);
Splay(Upper,Lower);
if(Cnt[Child[Upper][]]>)
{
Cnt[Child[Upper][]]--; Size[Child[Upper][]]--; Splay(Child[Upper][],);
}
else
{
Child[Upper][]=;
}
}
inline void Find(int Val)
{
int Now=Root;
if(!Now) return;
while(Child[Now][(Val>Quanzhi[Now])?:]&&(Quanzhi[Now]!=Val))
{
Now=Child[Now][(Val>Quanzhi[Now])?:];
}
Splay(Now,);
}
inline int Ask_Lower(int Val)
{
Find(Val);
int Now=Root;
if(Quanzhi[Now]<Val) return Now;
Now=Child[Now][];
while(Child[Now][]) Now=Child[Now][];
return Now;
}
inline int Ask_Upper(int Val)
{
Find(Val);
int Now=Root;
if(Quanzhi[Now]>Val) return Now;
Now=Child[Now][];
while(Child[Now][]) Now=Child[Now][];
return Now;
}
inline int Ask_Kth(int Id)
{
int Now=Root;
if(Size[Root]-<Id) return ;
for(;;)
{
if(Size[Child[Now][]]>=Id)
{
Now=Child[Now][];
}
else if(Size[Child[Now][]]+Cnt[Now]<Id)
{
Id-=Size[Child[Now][]]+Cnt[Now];
Now=Child[Now][];
}
else return Now;
}
}
int Time[N];
inline void Solve()
{
Init();
int i,Min=a[],Max=a[],tt=;
Insert(a[]); Time[Root]=++tt;
for(i=;i<=n;i++)
{
int Lower=Ask_Lower(a[i]),Upper=Ask_Upper(a[i]);
// printf("T[%d]=%d T[%d]=%d ",Lower,Time[Lower],Upper,Time[Upper]);
if(Time[Lower]>Time[Upper])
{
W(Quanzhi[Lower]);
}
else
{
W(Quanzhi[Upper]);
}
Insert(a[i]);
Time[Root]=++tt;
// puts("");
}
}
}
int main()
{
int i;
R(n);
for(i=;i<=n;i++) R(a[i]);
Pht::Solve();
return ;
}
/*
Input
3
1 2 3
Output
1 2 Input
5
4 2 3 1 6
Output
4 2 2 4 Input
10
991309218 517452607 870021923 978357992 136426010 10601767 302627526 883615372 163475700 600546765
Output
991309218 517452607 870021923 517452607 136426010 136426010 978357992 302627526 870021923
*/

codeforces675D的更多相关文章

  1. Codeforces675D(SummerTrainingDay06-J)

    D. Tree Construction time limit per test:2 seconds memory limit per test:256 megabytes input:standar ...

  2. codeforces675D Tree Construction

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...

随机推荐

  1. 【转载】java static 关键字的四种用法

    原文链接点这里,感谢博主分享 在java的关键字中,static和final是两个我们必须掌握的关键字.不同于其他关键字,他们都有多种用法,而且在一定环境下使用,可以提高程序的运行性能,优化程序的结构 ...

  2. cocos creator主程入门教程(九)—— 瓦片地图

    五邑隐侠,本名关健昌,10年游戏生涯,现隐居五邑.本系列文章以TypeScript为介绍语言. 这一篇介绍瓦片地图,在开发模拟经营类游戏.SLG类游戏.RPG游戏,都会使用到瓦片地图.瓦片地图地面是通 ...

  3. 图片与Base64相互转换 jar包

    1.右键项目 -->Properties -->Java Bulid Path-> Libraries -->JRE System Library-->Access ru ...

  4. java的设计模式 - 静态工厂方法

    静态工厂方法,也不知道为何叫这个名字.其实也就是一个静态函数,可以替代构造函数用.大名鼎鼎的 guava 就大量使用这种模式,这是非常有用的模式. 比如是 Integer i = Integer.va ...

  5. webstorm 2018.2.3 cmd+w无法关闭文件

  6. SAP MM 采购ERP顾问咨询费限制总金额的框架协议实现方案

    SAP MM 采购ERP顾问咨询费限制总金额的框架协议实现方案 [业务场景] 采购部门与ERP咨询公司签订了一个框架协议,只规定不同级别顾问的人天费用,不限定这些不同级别咨询顾问的具体采购的人天数,但 ...

  7. Python Learning: 02

    OK, let's continue. Conditional Judgments and Loop if if-else if-elif-else while for break continue ...

  8. python不能调试的原因

    最近有一个python项目,打开项目不能登录,想调试一下看看为什么,发现不能调试了,郁闷了,搞了半天,发现是进程里有多个python.exe,结束掉就好了.

  9. Wsus Content内容误删处理

    问题:在wsus content文件夹下误删除文件,需要重新下载文件解决方法:打开cmdcd C:\Program Files\Update Services\Tools\.\wsusutil.exe ...

  10. css子元素添加绝对定位,不添加top、left会有影响吗???

    子元素设置absolue,不设置top以及left值会有什么影响呢? 代码如下: .parent { width: 500px; height: 500px;   overflow: hidden; ...