void newDeleteNode(int p, int binary_search_index, int *dad, int *rson,
                   int *lson) {
  int q;
  if (dad[p] == binary_search_index)
    return;
  if (rson[p] == binary_search_index)
    q = lson[p];
  else if (lson[p] == binary_search_index)
    q = rson[p];
  else {
    q = lson[p];
    if (rson[q] != binary_search_index) {
      do {
        q = rson[q];
      } while (rson[q] != binary_search_index);
      rson[dad[q]] = lson[q];
      dad[lson[q]] = dad[q];
      lson[q] = lson[p];
      dad[lson[p]] = q;
    }
    rson[q] = rson[p];
    dad[rson[p]] = q;
  }
  dad[q] = dad[p];
  if (rson[dad[p]] == p)
    rson[dad[p]] = q;
  else
    lson[dad[p]] = q;
  dad[p] = binary_search_index;
}


x86 assembly (clang, -O0):
<newDeleteNode>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x4(%rbp)
mov    %esi,-0x8(%rbp)
mov    %rdx,-0x10(%rbp)
mov    %rcx,-0x18(%rbp)
mov    %r8,-0x20(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x4(%rbp),%rcx
mov    (%rax,%rcx,4),%eax
cmp    -0x8(%rbp),%eax
jne    112f <newDeleteNode+0x2f>
jmp    12d0 <newDeleteNode+0x1d0>
mov    -0x18(%rbp),%rax
movslq -0x4(%rbp),%rcx
mov    (%rax,%rcx,4),%eax
cmp    -0x8(%rbp),%eax
jne    1156 <newDeleteNode+0x56>
mov    -0x20(%rbp),%rax
movslq -0x4(%rbp),%rcx
mov    (%rax,%rcx,4),%eax
mov    %eax,-0x24(%rbp)
jmp    125f <newDeleteNode+0x15f>
mov    -0x20(%rbp),%rax
movslq -0x4(%rbp),%rcx
mov    (%rax,%rcx,4),%eax
cmp    -0x8(%rbp),%eax
jne    117d <newDeleteNode+0x7d>
mov    -0x18(%rbp),%rax
movslq -0x4(%rbp),%rcx
mov    (%rax,%rcx,4),%eax
mov    %eax,-0x24(%rbp)
jmp    125a <newDeleteNode+0x15a>
mov    -0x20(%rbp),%rax
movslq -0x4(%rbp),%rcx
mov    (%rax,%rcx,4),%eax
mov    %eax,-0x24(%rbp)
mov    -0x18(%rbp),%rax
movslq -0x24(%rbp),%rcx
mov    (%rax,%rcx,4),%eax
cmp    -0x8(%rbp),%eax
je     122e <newDeleteNode+0x12e>
jmp    11a4 <newDeleteNode+0xa4>
mov    -0x18(%rbp),%rax
movslq -0x24(%rbp),%rcx
mov    (%rax,%rcx,4),%eax
mov    %eax,-0x24(%rbp)
mov    -0x18(%rbp),%rax
movslq -0x24(%rbp),%rcx
mov    (%rax,%rcx,4),%eax
cmp    -0x8(%rbp),%eax
jne    11a4 <newDeleteNode+0xa4>
mov    -0x20(%rbp),%rax
movslq -0x24(%rbp),%rcx
mov    (%rax,%rcx,4),%edx
mov    -0x18(%rbp),%rax
mov    -0x10(%rbp),%rcx
movslq -0x24(%rbp),%rsi
movslq (%rcx,%rsi,4),%rcx
mov    %edx,(%rax,%rcx,4)
mov    -0x10(%rbp),%rax
movslq -0x24(%rbp),%rcx
mov    (%rax,%rcx,4),%edx
mov    -0x10(%rbp),%rax
mov    -0x20(%rbp),%rcx
movslq -0x24(%rbp),%rsi
movslq (%rcx,%rsi,4),%rcx
mov    %edx,(%rax,%rcx,4)
mov    -0x20(%rbp),%rax
movslq -0x4(%rbp),%rcx
mov    (%rax,%rcx,4),%edx
mov    -0x20(%rbp),%rax
movslq -0x24(%rbp),%rcx
mov    %edx,(%rax,%rcx,4)
mov    -0x24(%rbp),%edx
mov    -0x10(%rbp),%rax
mov    -0x20(%rbp),%rcx
movslq -0x4(%rbp),%rsi
movslq (%rcx,%rsi,4),%rcx
mov    %edx,(%rax,%rcx,4)
mov    -0x18(%rbp),%rax
movslq -0x4(%rbp),%rcx
mov    (%rax,%rcx,4),%edx
mov    -0x18(%rbp),%rax
movslq -0x24(%rbp),%rcx
mov    %edx,(%rax,%rcx,4)
mov    -0x24(%rbp),%edx
mov    -0x10(%rbp),%rax
mov    -0x18(%rbp),%rcx
movslq -0x4(%rbp),%rsi
movslq (%rcx,%rsi,4),%rcx
mov    %edx,(%rax,%rcx,4)
jmp    125f <newDeleteNode+0x15f>
mov    -0x10(%rbp),%rax
movslq -0x4(%rbp),%rcx
mov    (%rax,%rcx,4),%edx
mov    -0x10(%rbp),%rax
movslq -0x24(%rbp),%rcx
mov    %edx,(%rax,%rcx,4)
mov    -0x18(%rbp),%rax
mov    -0x10(%rbp),%rcx
movslq -0x4(%rbp),%rdx
movslq (%rcx,%rdx,4),%rcx
mov    (%rax,%rcx,4),%eax
cmp    -0x4(%rbp),%eax
jne    12ac <newDeleteNode+0x1ac>
mov    -0x24(%rbp),%edx
mov    -0x18(%rbp),%rax
mov    -0x10(%rbp),%rcx
movslq -0x4(%rbp),%rsi
movslq (%rcx,%rsi,4),%rcx
mov    %edx,(%rax,%rcx,4)
jmp    12c2 <newDeleteNode+0x1c2>
mov    -0x24(%rbp),%edx
mov    -0x20(%rbp),%rax
mov    -0x10(%rbp),%rcx
movslq -0x4(%rbp),%rsi
movslq (%rcx,%rsi,4),%rcx
mov    %edx,(%rax,%rcx,4)
mov    -0x8(%rbp),%edx
mov    -0x10(%rbp),%rax
movslq -0x4(%rbp),%rcx
mov    %edx,(%rax,%rcx,4)
pop    %rbp
ret

x86 assembly (clang, -O2):
<newDeleteNode>:
movslq %edi,%r9
mov    (%rdx,%r9,4),%eax
cmp    %esi,%eax
je     1192 <newDeleteNode+0x92>
mov    (%rcx,%r9,4),%r10d
mov    (%r8,%r9,4),%r11d
cmp    %esi,%r10d
je     1178 <newDeleteNode+0x78>
cmp    %esi,%r11d
jne    1126 <newDeleteNode+0x26>
mov    %r10d,%r11d
jmp    1178 <newDeleteNode+0x78>
movslq %r11d,%rax
mov    (%rcx,%rax,4),%edi
cmp    %esi,%edi
je     1168 <newDeleteNode+0x68>
mov    %edi,%r11d
movslq %edi,%rax
mov    (%rcx,%rax,4),%edi
cmp    %esi,%edi
jne    1130 <newDeleteNode+0x30>
mov    (%r8,%rax,4),%r10d
movslq (%rdx,%rax,4),%rdi
mov    %r10d,(%rcx,%rdi,4)
mov    (%rdx,%rax,4),%r10d
movslq (%r8,%rax,4),%rdi
mov    %r10d,(%rdx,%rdi,4)
mov    (%r8,%r9,4),%edi
mov    %edi,(%r8,%rax,4)
movslq (%r8,%r9,4),%rdi
mov    %eax,(%rdx,%rdi,4)
mov    (%rcx,%r9,4),%r10d
mov    %r10d,(%rcx,%rax,4)
movslq (%rcx,%r9,4),%rax
mov    %r11d,(%rdx,%rax,4)
mov    (%rdx,%r9,4),%eax
movslq %r11d,%rdi
mov    %eax,(%rdx,%rdi,4)
movslq (%rdx,%r9,4),%rax
cmp    %r9d,(%rcx,%rax,4)
cmove  %rcx,%r8
mov    %edi,(%r8,%rax,4)
mov    %esi,(%rdx,%r9,4)
ret

LLVM IR (-O0):
define void @newDeleteNode(i32 %0, i32 %1, i32* %2, i32* %3, i32* %4) {
%6 = alloca i32
%7 = alloca i32
%8 = alloca i32*
%9 = alloca i32*
%10 = alloca i32*
%11 = alloca i32
store i32 %0, i32* %6
store i32 %1, i32* %7
store i32* %2, i32** %8
store i32* %3, i32** %9
store i32* %4, i32** %10
%12 = load i32*, i32** %8
%13 = load i32, i32* %6
%14 = sext i32 %13 to i64
%15 = getelementptr inbounds i32, i32* %12, i64 %14
%16 = load i32, i32* %15
%17 = load i32, i32* %7
%18 = icmp eq i32 %16, %17
br i1 %18, label %19, label %20
19: ; preds = %5
br label %188
20: ; preds = %5
%21 = load i32*, i32** %9
%22 = load i32, i32* %6
%23 = sext i32 %22 to i64
%24 = getelementptr inbounds i32, i32* %21, i64 %23
%25 = load i32, i32* %24
%26 = load i32, i32* %7
%27 = icmp eq i32 %25, %26
br i1 %27, label %28, label %34
28: ; preds = %20
%29 = load i32*, i32** %10
%30 = load i32, i32* %6
%31 = sext i32 %30 to i64
%32 = getelementptr inbounds i32, i32* %29, i64 %31
%33 = load i32, i32* %32
store i32 %33, i32* %11
br label %141
34: ; preds = %20
%35 = load i32*, i32** %10
%36 = load i32, i32* %6
%37 = sext i32 %36 to i64
%38 = getelementptr inbounds i32, i32* %35, i64 %37
%39 = load i32, i32* %38
%40 = load i32, i32* %7
%41 = icmp eq i32 %39, %40
br i1 %41, label %42, label %48
42: ; preds = %34
%43 = load i32*, i32** %9
%44 = load i32, i32* %6
%45 = sext i32 %44 to i64
%46 = getelementptr inbounds i32, i32* %43, i64 %45
%47 = load i32, i32* %46
store i32 %47, i32* %11
br label %140
48: ; preds = %34
%49 = load i32*, i32** %10
%50 = load i32, i32* %6
%51 = sext i32 %50 to i64
%52 = getelementptr inbounds i32, i32* %49, i64 %51
%53 = load i32, i32* %52
store i32 %53, i32* %11
%54 = load i32*, i32** %9
%55 = load i32, i32* %11
%56 = sext i32 %55 to i64
%57 = getelementptr inbounds i32, i32* %54, i64 %56
%58 = load i32, i32* %57
%59 = load i32, i32* %7
%60 = icmp ne i32 %58, %59
br i1 %60, label %61, label %121
61: ; preds = %48
br label %62
62: ; preds = %68, %61
%63 = load i32*, i32** %9
%64 = load i32, i32* %11
%65 = sext i32 %64 to i64
%66 = getelementptr inbounds i32, i32* %63, i64 %65
%67 = load i32, i32* %66
store i32 %67, i32* %11
br label %68
68: ; preds = %62
%69 = load i32*, i32** %9
%70 = load i32, i32* %11
%71 = sext i32 %70 to i64
%72 = getelementptr inbounds i32, i32* %69, i64 %71
%73 = load i32, i32* %72
%74 = load i32, i32* %7
%75 = icmp ne i32 %73, %74
br i1 %75, label %62, label %76
76: ; preds = %68
%77 = load i32*, i32** %10
%78 = load i32, i32* %11
%79 = sext i32 %78 to i64
%80 = getelementptr inbounds i32, i32* %77, i64 %79
%81 = load i32, i32* %80
%82 = load i32*, i32** %9
%83 = load i32*, i32** %8
%84 = load i32, i32* %11
%85 = sext i32 %84 to i64
%86 = getelementptr inbounds i32, i32* %83, i64 %85
%87 = load i32, i32* %86
%88 = sext i32 %87 to i64
%89 = getelementptr inbounds i32, i32* %82, i64 %88
store i32 %81, i32* %89
%90 = load i32*, i32** %8
%91 = load i32, i32* %11
%92 = sext i32 %91 to i64
%93 = getelementptr inbounds i32, i32* %90, i64 %92
%94 = load i32, i32* %93
%95 = load i32*, i32** %8
%96 = load i32*, i32** %10
%97 = load i32, i32* %11
%98 = sext i32 %97 to i64
%99 = getelementptr inbounds i32, i32* %96, i64 %98
%100 = load i32, i32* %99
%101 = sext i32 %100 to i64
%102 = getelementptr inbounds i32, i32* %95, i64 %101
store i32 %94, i32* %102
%103 = load i32*, i32** %10
%104 = load i32, i32* %6
%105 = sext i32 %104 to i64
%106 = getelementptr inbounds i32, i32* %103, i64 %105
%107 = load i32, i32* %106
%108 = load i32*, i32** %10
%109 = load i32, i32* %11
%110 = sext i32 %109 to i64
%111 = getelementptr inbounds i32, i32* %108, i64 %110
store i32 %107, i32* %111
%112 = load i32, i32* %11
%113 = load i32*, i32** %8
%114 = load i32*, i32** %10
%115 = load i32, i32* %6
%116 = sext i32 %115 to i64
%117 = getelementptr inbounds i32, i32* %114, i64 %116
%118 = load i32, i32* %117
%119 = sext i32 %118 to i64
%120 = getelementptr inbounds i32, i32* %113, i64 %119
store i32 %112, i32* %120
br label %121
121: ; preds = %76, %48
%122 = load i32*, i32** %9
%123 = load i32, i32* %6
%124 = sext i32 %123 to i64
%125 = getelementptr inbounds i32, i32* %122, i64 %124
%126 = load i32, i32* %125
%127 = load i32*, i32** %9
%128 = load i32, i32* %11
%129 = sext i32 %128 to i64
%130 = getelementptr inbounds i32, i32* %127, i64 %129
store i32 %126, i32* %130
%131 = load i32, i32* %11
%132 = load i32*, i32** %8
%133 = load i32*, i32** %9
%134 = load i32, i32* %6
%135 = sext i32 %134 to i64
%136 = getelementptr inbounds i32, i32* %133, i64 %135
%137 = load i32, i32* %136
%138 = sext i32 %137 to i64
%139 = getelementptr inbounds i32, i32* %132, i64 %138
store i32 %131, i32* %139
br label %140
140: ; preds = %121, %42
br label %141
141: ; preds = %140, %28
%142 = load i32*, i32** %8
%143 = load i32, i32* %6
%144 = sext i32 %143 to i64
%145 = getelementptr inbounds i32, i32* %142, i64 %144
%146 = load i32, i32* %145
%147 = load i32*, i32** %8
%148 = load i32, i32* %11
%149 = sext i32 %148 to i64
%150 = getelementptr inbounds i32, i32* %147, i64 %149
store i32 %146, i32* %150
%151 = load i32*, i32** %9
%152 = load i32*, i32** %8
%153 = load i32, i32* %6
%154 = sext i32 %153 to i64
%155 = getelementptr inbounds i32, i32* %152, i64 %154
%156 = load i32, i32* %155
%157 = sext i32 %156 to i64
%158 = getelementptr inbounds i32, i32* %151, i64 %157
%159 = load i32, i32* %158
%160 = load i32, i32* %6
%161 = icmp eq i32 %159, %160
br i1 %161, label %162, label %172
162: ; preds = %141
%163 = load i32, i32* %11
%164 = load i32*, i32** %9
%165 = load i32*, i32** %8
%166 = load i32, i32* %6
%167 = sext i32 %166 to i64
%168 = getelementptr inbounds i32, i32* %165, i64 %167
%169 = load i32, i32* %168
%170 = sext i32 %169 to i64
%171 = getelementptr inbounds i32, i32* %164, i64 %170
store i32 %163, i32* %171
br label %182
172: ; preds = %141
%173 = load i32, i32* %11
%174 = load i32*, i32** %10
%175 = load i32*, i32** %8
%176 = load i32, i32* %6
%177 = sext i32 %176 to i64
%178 = getelementptr inbounds i32, i32* %175, i64 %177
%179 = load i32, i32* %178
%180 = sext i32 %179 to i64
%181 = getelementptr inbounds i32, i32* %174, i64 %180
store i32 %173, i32* %181
br label %182
182: ; preds = %172, %162
%183 = load i32, i32* %7
%184 = load i32*, i32** %8
%185 = load i32, i32* %6
%186 = sext i32 %185 to i64
%187 = getelementptr inbounds i32, i32* %184, i64 %186
store i32 %183, i32* %187
br label %188
188: ; preds = %182, %19
ret void
}

LLVM IR (-O2):
define void @newDeleteNode(i32 %0, i32 %1, i32* nocapture %2, i32* nocapture %3, i32* nocapture %4) {
%6 = sext i32 %0 to i64
%7 = getelementptr inbounds i32, i32* %2, i64 %6
%8 = load i32, i32* %7
%9 = icmp eq i32 %8, %1
br i1 %9, label %66, label %10
10: ; preds = %5
%11 = getelementptr inbounds i32, i32* %3, i64 %6
%12 = load i32, i32* %11
%13 = icmp eq i32 %12, %1
%14 = getelementptr inbounds i32, i32* %4, i64 %6
%15 = load i32, i32* %14
br i1 %13, label %54, label %16
16: ; preds = %10
%17 = icmp eq i32 %15, %1
br i1 %17, label %54, label %18
18: ; preds = %16
%19 = sext i32 %15 to i64
%20 = getelementptr inbounds i32, i32* %3, i64 %19
%21 = load i32, i32* %20
%22 = icmp eq i32 %21, %1
br i1 %22, label %45, label %23
23: ; preds = %18, %23
%24 = phi i32 [ %27, %23 ], [ %21, %18 ]
%25 = sext i32 %24 to i64
%26 = getelementptr inbounds i32, i32* %3, i64 %25
%27 = load i32, i32* %26
%28 = icmp eq i32 %27, %1
br i1 %28, label %29, label %23
29: ; preds = %23
%30 = getelementptr inbounds i32, i32* %4, i64 %25
%31 = load i32, i32* %30
%32 = getelementptr inbounds i32, i32* %2, i64 %25
%33 = load i32, i32* %32
%34 = sext i32 %33 to i64
%35 = getelementptr inbounds i32, i32* %3, i64 %34
store i32 %31, i32* %35
%36 = load i32, i32* %32
%37 = load i32, i32* %30
%38 = sext i32 %37 to i64
%39 = getelementptr inbounds i32, i32* %2, i64 %38
store i32 %36, i32* %39
%40 = load i32, i32* %14
store i32 %40, i32* %30
%41 = load i32, i32* %14
%42 = sext i32 %41 to i64
%43 = getelementptr inbounds i32, i32* %2, i64 %42
store i32 %24, i32* %43
%44 = load i32, i32* %11
br label %45
45: ; preds = %29, %18
%46 = phi i64 [ %25, %29 ], [ %19, %18 ]
%47 = phi i32 [ %44, %29 ], [ %12, %18 ]
%48 = phi i32 [ %24, %29 ], [ %15, %18 ]
%49 = getelementptr inbounds i32, i32* %3, i64 %46
store i32 %47, i32* %49
%50 = load i32, i32* %11
%51 = sext i32 %50 to i64
%52 = getelementptr inbounds i32, i32* %2, i64 %51
store i32 %48, i32* %52
%53 = load i32, i32* %7
br label %54
54: ; preds = %10, %16, %45
%55 = phi i32 [ %53, %45 ], [ %8, %16 ], [ %8, %10 ]
%56 = phi i32 [ %48, %45 ], [ %12, %16 ], [ %15, %10 ]
%57 = sext i32 %56 to i64
%58 = getelementptr inbounds i32, i32* %2, i64 %57
store i32 %55, i32* %58
%59 = load i32, i32* %7
%60 = sext i32 %59 to i64
%61 = getelementptr inbounds i32, i32* %3, i64 %60
%62 = load i32, i32* %61
%63 = icmp eq i32 %62, %0
%64 = getelementptr inbounds i32, i32* %4, i64 %60
%65 = select i1 %63, i32* %61, i32* %64
store i32 %56, i32* %65
store i32 %1, i32* %7
br label %66
66: ; preds = %5, %54
ret void
}