const int N=1e5+6;int pile[N],data[N];int idx=1,n;for(int i=1;i pile[idx]=data[i], idx++;}int ind=idx-1;while(2*ind>=idx) ind--; // 找到最后一个非叶子节点的下标void down_adjust(int pa){ if(2*pa if(pile[2*pa]>pile[2*pa+1]){ if(pile[2*pa]>pile[pa]){ exchange(pa,2*pa); down_adjust(2*pa); } } else{ if(pile[2*pa+1]>pile[pa]){ exchange(pa,2*pa+1); down_adjust(2*pa+1); } } } if(2*pa=idx){ if(pile[2*pa]>pile[pa]){ exchange(pa,2*pa); down_adjust(2*pa); } }}// 遍历调整for(int i=ind;i>=1;i--){ int p=pile[i],l,r; if(2*i+1 else l=pile[2*i], r=pile[i]-1; if(l>p && l>r){ exchange(i,2*i); down_adjust(2*i); } if(r>p && r>l){ exchange(i,2*i+1); down_adjust(2*i+1); }}