#define null -1
struct Node
{
int key;
int l,r,f,dis;
}tree[maxn];
//得到节点标号为r的节点的跟节点编号
int getroot(int r)
{
if(r==null)return r;
while(tree[r].f!=null)
r=tree[r].f;
return r;
}
//合并两个左偏树
int merge(int rx,int ry)
{
if(rx==null)return ry;
if(ry==null)return rx;
if(tree[rx].key>tree[ry].key)swap(rx,ry);
int r=merge(tree[rx].r,ry);
tree[rx].r=r;
tree[r].f=rx;
if(tree[rx].l==null||tree[r].dis>tree[tree[rx].l].dis)
swap(tree[rx].l,tree[rx].r);
if(tree[rx].r==null)tree[rx].dis=0;
else tree[rx].dis=tree[tree[rx].r].dis+1;
return rx;
}
//插入节点,节点编号为r,插入后的节点为root
int insert(int r,int key,int root)
{
tree[r].key=key;
tree[r].l=tree[r].r=tree[r].f=null;
tree[r].dis=0;
return root=merge(root,r);
}
//删除编号为o的点
int del(int o)
{
if(o==null)return o;
int l=tree[o].l;
int r=tree[o].r;
int y=tree[o].f;
int x;
tree[o].l=tree[o].r=tree[o].f=null;
tree[x=merge(l,r)].f=y;
if(y!=null&&tree[y].l==o)tree[y].l==x;
if(y!=null&&tree[y].r==o)tree[y].r==x;
for(;y!=null;x=y,y=tree[y].f)
{
if(tree[tree[y].l].dis<tree[tree[y].r].dis)
swap(tree[y].l,tree[y].r);
if(tree[tree[y].r].dis+1==tree[y].dis)
break;
tree[y].dis=tree[tree[y].r].dis+1;
}
if(x!=null)return getroot(x);
else return getroot(y);
}
Node top(int r)
{
return tree[r];
}
//返回最值
Node pop(int &o)
{
Node out=tree[o];
int l=tree[o].l,r=tree[o].r;
tree[o].l=tree[o].r=tree[o].f=null;
tree[l].f=tree[r].f=null;
o=merge(l,r);
return out;
}
//编号为o的节点加上val
int add(int o,int val)
{
if(o==null)return o;
if(tree[o].l==null&&tree[o].r==null&&tree[o].f==null)
{
tree[o].key+=val;
return o;
}
int key=tree[o].key+val;
int rt=del(o);
return insert(o,key,rt);
}
void init()
{
for(int i=1;i<=N;i++)
{
scanf("%d",tree[i].key);
tree[i].l=tree[i].r=tree[i].f=null;
tree[i].dis=0;
}
}