#define NULL ((void *)0)
typedef unsigned long size_t; // Customize by platform.
typedef long intptr_t;
typedef unsigned long uintptr_t;
typedef long scalar_t__; // Either arithmetic or pointer type.
/* By default, we understand bool (as a convenience). */
typedef int bool;
#define false 0
#define true 1

/* Forward declarations */

/* Type definitions */

/* Variables and functions */
int /*<<< orphan*/ printf(char *, short);
int /*<<< orphan*/ scanf(char *, short *);
void main() {
  short i, n, l, tc[51], tmp, k, j, p, sw;
  scanf("%hd", &n);
  for (i = 0; i < n; i++) {
    scanf("%hd", &l);
    for (j = 0; j < l; j++)
      scanf("%hd", &tc[j]);
    sw = 0;
    for (p = 0; p < j - 1; p++)
      for (k = p + 1; k < j; k++)
        if (tc[p] > tc[k]) {
          tmp = tc[k];
          tc[k] = tc[p];
          tc[p] = tmp;
          sw++;
        }
    printf("Optimal train swapping takes %hd swaps.\n", sw);
  }
}


x86 assembly (clang, -O0):
<main>:
push   %rbp
mov    %rsp,%rbp
sub    $0x80,%rsp
lea    0xece(%rip),%rdi
lea    -0x4(%rbp),%rsi
call   1040 <scanf@plt>
movw   $0x0,-0x2(%rbp)
movswl -0x2(%rbp),%eax
movswl -0x4(%rbp),%ecx
cmp    %ecx,%eax
jge    1283 <main+0x163>
lea    0xea8(%rip),%rdi
lea    -0x6(%rbp),%rsi
call   1040 <scanf@plt>
movw   $0x0,-0x76(%rbp)
movswl -0x76(%rbp),%eax
movswl -0x6(%rbp),%ecx
cmp    %ecx,%eax
jge    11a4 <main+0x84>
movswq -0x76(%rbp),%rax
lea    -0x70(%rbp),%rsi
shl    $0x1,%rax
add    %rax,%rsi
lea    0xe72(%rip),%rdi
call   1040 <scanf@plt>
mov    -0x76(%rbp),%ax
add    $0x1,%ax
mov    %ax,-0x76(%rbp)
jmp    1167 <main+0x47>
movw   $0x0,-0x7a(%rbp)
movw   $0x0,-0x78(%rbp)
movswl -0x78(%rbp),%eax
movswl -0x76(%rbp),%ecx
sub    $0x1,%ecx
cmp    %ecx,%eax
jge    1262 <main+0x142>
movswl -0x78(%rbp),%eax
add    $0x1,%eax
mov    %ax,-0x74(%rbp)
movswl -0x74(%rbp),%eax
movswl -0x76(%rbp),%ecx
cmp    %ecx,%eax
jge    124c <main+0x12c>
movswq -0x78(%rbp),%rax
movswl -0x70(%rbp,%rax,2),%eax
movswq -0x74(%rbp),%rcx
movswl -0x70(%rbp,%rcx,2),%ecx
cmp    %ecx,%eax
jle    1236 <main+0x116>
movswq -0x74(%rbp),%rax
mov    -0x70(%rbp,%rax,2),%ax
mov    %ax,-0x72(%rbp)
movswq -0x78(%rbp),%rax
mov    -0x70(%rbp,%rax,2),%cx
movswq -0x74(%rbp),%rax
mov    %cx,-0x70(%rbp,%rax,2)
mov    -0x72(%rbp),%cx
movswq -0x78(%rbp),%rax
mov    %cx,-0x70(%rbp,%rax,2)
mov    -0x7a(%rbp),%ax
add    $0x1,%ax
mov    %ax,-0x7a(%rbp)
jmp    123b <main+0x11b>
mov    -0x74(%rbp),%ax
add    $0x1,%ax
mov    %ax,-0x74(%rbp)
jmp    11ce <main+0xae>
jmp    1251 <main+0x131>
mov    -0x78(%rbp),%ax
add    $0x1,%ax
mov    %ax,-0x78(%rbp)
jmp    11b0 <main+0x90>
lea    0xd9b(%rip),%rdi
movswl -0x7a(%rbp),%esi
call   1030 <printf@plt>
mov    -0x2(%rbp),%ax
add    $0x1,%ax
mov    %ax,-0x2(%rbp)
jmp    1141 <main+0x21>
add    $0x80,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<main>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x78,%rsp
lea    0xecb(%rip),%rdi
lea    0xe(%rsp),%rsi
call   1040 <scanf@plt>
cmpw   $0x0,0xe(%rsp)
jle    12b0 <main+0x190>
xor    %r13d,%r13d
lea    0xeab(%rip),%r12
jmp    1181 <main+0x61>
nopw   0x0(%rax,%rax,1)
xor    %ecx,%ecx
movswl %cx,%esi
lea    0xe98(%rip),%rdi
call   1030 <printf@plt>
add    $0x1,%r13d
cmp    0xe(%rsp),%r13w
jge    12b0 <main+0x190>
mov    %r12,%rdi
lea    0xc(%rsp),%rsi
call   1040 <scanf@plt>
cmpw   $0x0,0xc(%rsp)
jle    1160 <main+0x40>
mov    $0xfffe,%r15w
lea    0x10(%rsp),%rbx
xor    %eax,%eax
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
mov    %rax,%r14
mov    %r12,%rdi
mov    %rbx,%rsi
call   1040 <scanf@plt>
lea    0x1(%r14),%rax
movswq 0xc(%rsp),%rcx
add    $0x2,%rbx
add    $0x1,%r15d
cmp    %rcx,%rax
jl     11b0 <main+0x90>
cmp    $0x2,%ax
jb     1160 <main+0x40>
lea    -0x1(%rax),%r8
add    $0x1,%r14
mov    $0x1,%r10w
xor    %ecx,%ecx
xor    %r9d,%r9d
jmp    1201 <main+0xe1>
nop
movswl %r9w,%edx
add    $0x1,%r10d
cmp    %edx,%r8d
jle    1162 <main+0x42>
mov    %r9d,%esi
lea    0x1(%rsi),%r9d
cmp    %ax,%r9w
jge    11f0 <main+0xd0>
mov    %r15d,%ebp
sub    %esi,%ebp
add    $0x1,%ebp
movswq %r10w,%rbx
movswq %si,%rdx
movzwl 0x10(%rsp,%rdx,2),%edi
test   $0x1,%bpl
je     124a <main+0x12a>
movzwl 0x10(%rsp,%rbx,2),%r11d
cmp    %r11w,%di
jle    1246 <main+0x126>
mov    %di,0x10(%rsp,%rbx,2)
mov    %r11w,0x10(%rsp,%rdx,2)
add    $0x1,%ecx
mov    %r11d,%edi
add    $0x1,%rbx
cmp    %si,%r15w
jne    127b <main+0x15b>
jmp    11f0 <main+0xd0>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
mov    %si,0x12(%rsp,%rbx,2)
mov    %di,0x10(%rsp,%rdx,2)
add    $0x1,%ecx
add    $0x2,%rbx
cmp    %bx,%r14w
je     11f0 <main+0xd0>
movzwl 0x10(%rsp,%rbx,2),%esi
cmp    %si,%di
jle    12a0 <main+0x180>
mov    %di,0x10(%rsp,%rbx,2)
mov    %si,0x10(%rsp,%rdx,2)
add    $0x1,%ecx
jmp    12a2 <main+0x182>
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
mov    %edi,%esi
movzwl 0x12(%rsp,%rbx,2),%edi
cmp    %di,%si
jg     1260 <main+0x140>
mov    %esi,%edi
jmp    126d <main+0x14d>
add    $0x78,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

LLVM IR (-O0):
@.str = [4 x i8] c"%hd\00"
@.str.1 = [41 x i8] c"Optimal train swapping takes %hd swaps.\0A\00"
define void @main() {
%1 = alloca i16
%2 = alloca i16
%3 = alloca i16
%4 = alloca [51 x i16]
%5 = alloca i16
%6 = alloca i16
%7 = alloca i16
%8 = alloca i16
%9 = alloca i16
%10 = call i32 @scanf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i64 0, i64 0), i16* %2)
store i16 0, i16* %1
br label %11
11: ; preds = %93, %0
%12 = load i16, i16* %1
%13 = sext i16 %12 to i32
%14 = load i16, i16* %2
%15 = sext i16 %14 to i32
%16 = icmp slt i32 %13, %15
br i1 %16, label %17, label %96
17: ; preds = %11
%18 = call i32 @scanf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i64 0, i64 0), i16* %3)
store i16 0, i16* %7
br label %19
19: ; preds = %30, %17
%20 = load i16, i16* %7
%21 = sext i16 %20 to i32
%22 = load i16, i16* %3
%23 = sext i16 %22 to i32
%24 = icmp slt i32 %21, %23
br i1 %24, label %25, label %33
25: ; preds = %19
%26 = load i16, i16* %7
%27 = sext i16 %26 to i64
%28 = getelementptr inbounds [51 x i16], [51 x i16]* %4, i64 0, i64 %27
%29 = call i32 @scanf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i64 0, i64 0), i16* %28)
br label %30
30: ; preds = %25
%31 = load i16, i16* %7
%32 = add i16 %31, 1
store i16 %32, i16* %7
br label %19
33: ; preds = %19
store i16 0, i16* %9
store i16 0, i16* %8
br label %34
34: ; preds = %87, %33
%35 = load i16, i16* %8
%36 = sext i16 %35 to i32
%37 = load i16, i16* %7
%38 = sext i16 %37 to i32
%39 = sub nsw i32 %38, 1
%40 = icmp slt i32 %36, %39
br i1 %40, label %41, label %90
41: ; preds = %34
%42 = load i16, i16* %8
%43 = sext i16 %42 to i32
%44 = add nsw i32 %43, 1
%45 = trunc i32 %44 to i16
store i16 %45, i16* %6
br label %46
46: ; preds = %83, %41
%47 = load i16, i16* %6
%48 = sext i16 %47 to i32
%49 = load i16, i16* %7
%50 = sext i16 %49 to i32
%51 = icmp slt i32 %48, %50
br i1 %51, label %52, label %86
52: ; preds = %46
%53 = load i16, i16* %8
%54 = sext i16 %53 to i64
%55 = getelementptr inbounds [51 x i16], [51 x i16]* %4, i64 0, i64 %54
%56 = load i16, i16* %55
%57 = sext i16 %56 to i32
%58 = load i16, i16* %6
%59 = sext i16 %58 to i64
%60 = getelementptr inbounds [51 x i16], [51 x i16]* %4, i64 0, i64 %59
%61 = load i16, i16* %60
%62 = sext i16 %61 to i32
%63 = icmp sgt i32 %57, %62
br i1 %63, label %64, label %82
64: ; preds = %52
%65 = load i16, i16* %6
%66 = sext i16 %65 to i64
%67 = getelementptr inbounds [51 x i16], [51 x i16]* %4, i64 0, i64 %66
%68 = load i16, i16* %67
store i16 %68, i16* %5
%69 = load i16, i16* %8
%70 = sext i16 %69 to i64
%71 = getelementptr inbounds [51 x i16], [51 x i16]* %4, i64 0, i64 %70
%72 = load i16, i16* %71
%73 = load i16, i16* %6
%74 = sext i16 %73 to i64
%75 = getelementptr inbounds [51 x i16], [51 x i16]* %4, i64 0, i64 %74
store i16 %72, i16* %75
%76 = load i16, i16* %5
%77 = load i16, i16* %8
%78 = sext i16 %77 to i64
%79 = getelementptr inbounds [51 x i16], [51 x i16]* %4, i64 0, i64 %78
store i16 %76, i16* %79
%80 = load i16, i16* %9
%81 = add i16 %80, 1
store i16 %81, i16* %9
br label %82
82: ; preds = %64, %52
br label %83
83: ; preds = %82
%84 = load i16, i16* %6
%85 = add i16 %84, 1
store i16 %85, i16* %6
br label %46
86: ; preds = %46
br label %87
87: ; preds = %86
%88 = load i16, i16* %8
%89 = add i16 %88, 1
store i16 %89, i16* %8
br label %34
90: ; preds = %34
%91 = load i16, i16* %9
%92 = call i32 @printf(i8* getelementptr inbounds ([41 x i8], [41 x i8]* @.str.1, i64 0, i64 0), i16 signext %91)
br label %93
93: ; preds = %90
%94 = load i16, i16* %1
%95 = add i16 %94, 1
store i16 %95, i16* %1
br label %11
96: ; preds = %11
ret void
}

LLVM IR (-O2):
@.str = [4 x i8] c"%hd\00"
@.str.1 = [41 x i8] c"Optimal train swapping takes %hd swaps.\0A\00"
define void @main() {
%1 = alloca i16
%2 = alloca i16
%3 = alloca [51 x i16]
%4 = bitcast i16* %1 to i8*
%5 = bitcast i16* %2 to i8*
%6 = bitcast [51 x i16]* %3 to i8*
%7 = call i32 @scanf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i64 0, i64 0), i16* %1)
%8 = load i16, i16* %1
%9 = icmp sgt i16 %8, 0
br i1 %9, label %10, label %97
10: ; preds = %0, %91
%11 = phi i16 [ %94, %91 ], [ 0, %0 ]
%12 = call i32 @scanf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i64 0, i64 0), i16* %2)
%13 = load i16, i16* %2
%14 = icmp sgt i16 %13, 0
br i1 %14, label %23, label %91
15: ; preds = %23
%16 = trunc i64 %27 to i16
%17 = trunc i64 %27 to i32
%18 = and i32 %17, 65535
%19 = add nsw i32 %18, -1
%20 = icmp ugt i16 %16, 1
br i1 %20, label %21, label %91
21: ; preds = %15
%22 = add nsw i16 %16, -2
br label %31
23: ; preds = %10, %23
%24 = phi i64 [ %27, %23 ], [ 0, %10 ]
%25 = getelementptr inbounds [51 x i16], [51 x i16]* %3, i64 0, i64 %24
%26 = call i32 @scanf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i64 0, i64 0), i16* %25)
%27 = add nuw nsw i64 %24, 1
%28 = load i16, i16* %2
%29 = sext i16 %28 to i64
%30 = icmp slt i64 %27, %29
br i1 %30, label %23, label %15
31: ; preds = %21, %86
%32 = phi i16 [ %90, %86 ], [ 1, %21 ]
%33 = phi i16 [ %87, %86 ], [ 0, %21 ]
%34 = phi i16 [ %35, %86 ], [ 0, %21 ]
%35 = add i16 %34, 1
%36 = icmp slt i16 %35, %16
br i1 %36, label %37, label %86
37: ; preds = %31
%38 = xor i16 %34, -1
%39 = add i16 %38, %16
%40 = sext i16 %32 to i64
%41 = sext i16 %34 to i64
%42 = getelementptr inbounds [51 x i16], [51 x i16]* %3, i64 0, i64 %41
%43 = load i16, i16* %42
%44 = and i16 %39, 1
%45 = icmp eq i16 %44, 0
br i1 %45, label %56, label %46
46: ; preds = %37
%47 = getelementptr inbounds [51 x i16], [51 x i16]* %3, i64 0, i64 %40
%48 = load i16, i16* %47
%49 = icmp sgt i16 %43, %48
br i1 %49, label %50, label %52
50: ; preds = %46
store i16 %43, i16* %47
store i16 %48, i16* %42
%51 = add i16 %33, 1
br label %52
52: ; preds = %50, %46
%53 = phi i16 [ %48, %50 ], [ %43, %46 ]
%54 = phi i16 [ %51, %50 ], [ %33, %46 ]
%55 = add nsw i64 %40, 1
br label %56
56: ; preds = %52, %37
%57 = phi i16 [ undef, %37 ], [ %54, %52 ]
%58 = phi i16 [ %43, %37 ], [ %53, %52 ]
%59 = phi i64 [ %40, %37 ], [ %55, %52 ]
%60 = phi i16 [ %33, %37 ], [ %54, %52 ]
%61 = icmp eq i16 %22, %34
br i1 %61, label %86, label %62
62: ; preds = %56, %80
%63 = phi i16 [ %81, %80 ], [ %58, %56 ]
%64 = phi i64 [ %83, %80 ], [ %59, %56 ]
%65 = phi i16 [ %82, %80 ], [ %60, %56 ]
%66 = getelementptr inbounds [51 x i16], [51 x i16]* %3, i64 0, i64 %64
%67 = load i16, i16* %66
%68 = icmp sgt i16 %63, %67
br i1 %68, label %69, label %71
69: ; preds = %62
store i16 %63, i16* %66
store i16 %67, i16* %42
%70 = add i16 %65, 1
br label %71
71: ; preds = %62, %69
%72 = phi i16 [ %67, %69 ], [ %63, %62 ]
%73 = phi i16 [ %70, %69 ], [ %65, %62 ]
%74 = add nsw i64 %64, 1
%75 = getelementptr inbounds [51 x i16], [51 x i16]* %3, i64 0, i64 %74
%76 = load i16, i16* %75
%77 = icmp sgt i16 %72, %76
br i1 %77, label %78, label %80
78: ; preds = %71
store i16 %72, i16* %75
store i16 %76, i16* %42
%79 = add i16 %73, 1
br label %80
80: ; preds = %78, %71
%81 = phi i16 [ %76, %78 ], [ %72, %71 ]
%82 = phi i16 [ %79, %78 ], [ %73, %71 ]
%83 = add nsw i64 %64, 2
%84 = trunc i64 %83 to i16
%85 = icmp eq i16 %16, %84
br i1 %85, label %86, label %62
86: ; preds = %56, %80, %31
%87 = phi i16 [ %33, %31 ], [ %57, %56 ], [ %82, %80 ]
%88 = sext i16 %35 to i32
%89 = icmp sgt i32 %19, %88
%90 = add i16 %32, 1
br i1 %89, label %31, label %91
91: ; preds = %86, %10, %15
%92 = phi i16 [ 0, %15 ], [ 0, %10 ], [ %87, %86 ]
%93 = call i32 @printf(i8* getelementptr inbounds ([41 x i8], [41 x i8]* @.str.1, i64 0, i64 0), i16 signext %92)
%94 = add nuw nsw i16 %11, 1
%95 = load i16, i16* %1
%96 = icmp slt i16 %94, %95
br i1 %96, label %10, label %97
97: ; preds = %91, %0
ret void
}