const int MAXS=MAXN*60;
int root[MAXN],tot;
struct Node{
int max_cnt,ans;//自己需要维护的信息
int ch[2];
}node[MAXS];
void push_up(int k){//自定义
if(node[node[k].ch[0]].max_cnt>=node[node[k].ch[1]].max_cnt)
node[k].max_cnt=node[node[k].ch[0]].max_cnt,node[k].ans=node[node[k].ch[0]].ans;
else
node[k].max_cnt=node[node[k].ch[1]].max_cnt,node[k].ans=node[node[k].ch[1]].ans;
}
void update(int &k,int lef,int rig,int pos,int v){
if(!k) k=++tot;
if(lef==rig) return node[k].max_cnt+=v,node[k].ans=pos,void();
int mid=lef+rig>>1;
if(pos>mid)
update(node[k].ch[1],mid+1,rig,pos,v);
else
update(node[k].ch[0],lef,mid,pos,v);
push_up(k);
}
void Merge(int &k1,int k2,int lef,int rig){
if(!k1||!k2) return k1|=k2,void();
if(lef==rig) return node[k1].max_cnt+=node[k2].max_cnt,void();
int mid=lef+rig>>1;
Merge(node[k1].ch[0],node[k2].ch[0],lef,mid);
Merge(node[k1].ch[1],node[k2].ch[1],mid+1,rig);
push_up(k1);
}