在合并函数中一定要在合并子节点后pushup
inline void merge(int x,int y){
if (nodes[x].l && nodes[x].r){
merge(nodes[x].l,nodes[y].l);
merge(nodes[x].r,nodes[y].r);
pushup(x);
}else{
if (!nodes[x].l && !nodes[x].r && !nodes[y].l && !nodes[y].r){
nodes[x].w += nodes[y].w;
return;
}
if (!nodes[x].l) nodes[x].l = nodes[y].l;
else if (nodes[y].l) merge(nodes[x].l,nodes[y].l);
if (!nodes[x].r) nodes[x].r = nodes[y].r;
else if (nodes[y].r) merge(nodes[x].r,nodes[y].r);
pushup(x);
}
}