// File: chhylp123[P]hifiasm/hic.cpp
// Function: pop_pdq(pdq*, unsigned long*, unsigned long*)
void pop_pdq(pdq* q, uint64_t* min_v, uint64_t* min_dis)
{
    (*min_v) = (*min_dis) = (uint64_t)-1;
    if(pdq_cnt(*q) == 0) return;
    get_dv_adv((*q).x.a[1], (*q).uID_mode, (*q).uID_shift, min_v, min_dis);
    /*******************************for debug************************************/
    // uint64_t i;
    // for (i = 1; i < q->x.n; i++)
    // {
    //     if(weight(*q, i) < (*min_dis)) fprintf(stderr, "ERROR\n");
    // }
    /*******************************for debug************************************/
    ///min = q->x.a[1];
    swap_pdq(&(q->x.a[1]), &(q->x.a[pdq_cnt(*q)]));
    pdq_cnt(*q)--;
    q->x.n--;

    int c_i = 1, left_i, right_i, min_i, flag = 1;
    while(flag == 1) 
    {
        flag = 0;
        left_i = c_i << 1;
        right_i = left_i + 1;
        if(left_i > (int)(pdq_cnt(*q)))
        {
            break; // both children are null
        } 
        else if(right_i > (int)(pdq_cnt(*q)))
        {
            min_i = left_i; // right children is null
        }
        else
        {
            min_i = (weight(*q, left_i) < weight(*q, right_i))? left_i : right_i;
        }

        if(weight(*q, c_i) > weight(*q, min_i))
        {
            swap_pdq(&(q->x.a[c_i]), &(q->x.a[min_i]));
            c_i = min_i;
            flag = 1;
        }
    }
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x50, %rsp
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
movq %rdx, -0x18(%rbp)
movq -0x18(%rbp), %rax
movq $-0x1, (%rax)
movq -0x10(%rbp), %rax
movq $-0x1, (%rax)
movq -0x8(%rbp), %rax
movq 0x28(%rax), %rax
cmpq $0x0, (%rax)
jne 0x1cbe4d
jmp 0x1cc06e
movq -0x8(%rbp), %rax
movq 0x28(%rax), %rax
movq 0x8(%rax), %rdi
movq -0x8(%rbp), %rax
movq 0x48(%rax), %rsi
movq -0x8(%rbp), %rax
movq 0x50(%rax), %rdx
movq -0x10(%rbp), %rcx
movq -0x18(%rbp), %r8
callq 0x214590
movq -0x8(%rbp), %rax
movq 0x28(%rax), %rdi
addq $0x8, %rdi
movq -0x8(%rbp), %rax
movq 0x28(%rax), %rsi
movq -0x8(%rbp), %rax
movq 0x28(%rax), %rax
movq (%rax), %rax
shlq $0x3, %rax
addq %rax, %rsi
callq 0x1cbc10
movq -0x8(%rbp), %rax
movq 0x28(%rax), %rax
movq (%rax), %rcx
addq $-0x1, %rcx
movq %rcx, (%rax)
movq -0x8(%rbp), %rax
movq 0x18(%rax), %rcx
addq $-0x1, %rcx
movq %rcx, 0x18(%rax)
movl $0x1, -0x1c(%rbp)
movl $0x1, -0x2c(%rbp)
cmpl $0x1, -0x2c(%rbp)
jne 0x1cc06e
movl $0x0, -0x2c(%rbp)
movl -0x1c(%rbp), %eax
shll %eax
movl %eax, -0x20(%rbp)
movl -0x20(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x24(%rbp)
movl -0x20(%rbp), %eax
movq -0x8(%rbp), %rcx
movq 0x28(%rcx), %rcx
movq (%rcx), %rcx
cmpl %ecx, %eax
jle 0x1cbf0a
jmp 0x1cc06e
movl -0x24(%rbp), %eax
movq -0x8(%rbp), %rcx
movq 0x28(%rcx), %rcx
movq (%rcx), %rcx
cmpl %ecx, %eax
jle 0x1cbf27
movl -0x20(%rbp), %eax
movl %eax, -0x28(%rbp)
jmp 0x1cbfb5
movq -0x8(%rbp), %rax
movq 0x28(%rax), %rax
movslq -0x20(%rbp), %rcx
movq (%rax,%rcx,8), %rdi
movq -0x8(%rbp), %rax
movq 0x48(%rax), %rsi
movq -0x8(%rbp), %rax
movq 0x50(%rax), %rdx
movq -0x8(%rbp), %rcx
addq $0x58, %rcx
movq -0x8(%rbp), %r8
addq $0x60, %r8
callq 0x214590
movq %rax, -0x38(%rbp)
movq -0x8(%rbp), %rax
movq 0x28(%rax), %rax
movslq -0x24(%rbp), %rcx
movq (%rax,%rcx,8), %rdi
movq -0x8(%rbp), %rax
movq 0x48(%rax), %rsi
movq -0x8(%rbp), %rax
movq 0x50(%rax), %rdx
movq -0x8(%rbp), %rcx
addq $0x58, %rcx
movq -0x8(%rbp), %r8
addq $0x60, %r8
callq 0x214590
movq %rax, %rcx
movq -0x38(%rbp), %rax
cmpq %rcx, %rax
jae 0x1cbfa9
movl -0x20(%rbp), %eax
movl %eax, -0x3c(%rbp)
jmp 0x1cbfaf
movl -0x24(%rbp), %eax
movl %eax, -0x3c(%rbp)
movl -0x3c(%rbp), %eax
movl %eax, -0x28(%rbp)
jmp 0x1cbfb7
movq -0x8(%rbp), %rax
movq 0x28(%rax), %rax
movslq -0x1c(%rbp), %rcx
movq (%rax,%rcx,8), %rdi
movq -0x8(%rbp), %rax
movq 0x48(%rax), %rsi
movq -0x8(%rbp), %rax
movq 0x50(%rax), %rdx
movq -0x8(%rbp), %rcx
addq $0x58, %rcx
movq -0x8(%rbp), %r8
addq $0x60, %r8
callq 0x214590
movq %rax, -0x48(%rbp)
movq -0x8(%rbp), %rax
movq 0x28(%rax), %rax
movslq -0x28(%rbp), %rcx
movq (%rax,%rcx,8), %rdi
movq -0x8(%rbp), %rax
movq 0x48(%rax), %rsi
movq -0x8(%rbp), %rax
movq 0x50(%rax), %rdx
movq -0x8(%rbp), %rcx
addq $0x58, %rcx
movq -0x8(%rbp), %r8
addq $0x60, %r8
callq 0x214590
movq %rax, %rcx
movq -0x48(%rbp), %rax
cmpq %rcx, %rax
jbe 0x1cc069
movq -0x8(%rbp), %rax
movq 0x28(%rax), %rdi
movslq -0x1c(%rbp), %rax
shlq $0x3, %rax
addq %rax, %rdi
movq -0x8(%rbp), %rax
movq 0x28(%rax), %rsi
movslq -0x28(%rbp), %rax
shlq $0x3, %rax
addq %rax, %rsi
callq 0x1cbc10
movl -0x28(%rbp), %eax
movl %eax, -0x1c(%rbp)
movl $0x1, -0x2c(%rbp)
jmp 0x1cbed1
addq $0x50, %rsp
popq %rbp
retq
nopw %cs:(%rax,%rax)