Program lists;
uses SysUtils, Classes;
const SIZE : integer = 10000;
Function test_lists : integer;
var
i, len1, len2 : integer;
Li1, Li2, Li3 : TList;
lists_equal : Integer;
begin
Li1 := TList.Create;
Li1.Capacity := SIZE;
For i := 0 to SIZE Do
Li1.Add(Pointer(i));
Li2 := TList.Create;
Li2.Capacity := SIZE;
For i:= 0 to SIZE Do
Li2.Add(Li1.Items[i]);
{ remove each individual item from left side of Li2 and
append to right side of Li3 (preserving order) }
Li3 := TList.Create;
Li3.Capacity := SIZE;
For i := 0 to SIZE Do
begin
Li3.Add( Li2.First );
Li2.Remove( Li2.First );
end;
{ remove each individual item from right side of Li3 and
append to right side of Li2 (reversing list) }
For i := 0 To SIZE Do
begin
Li2.Add( Li3.Last );
Li3.Count := Li3.Count - 1;
end;
For i := 0 To (SIZE div 2) Do
begin
Li1.Exchange( i, SIZE-i );
end;
If integer(Li1.first) <> SIZE Then
begin
test_lists := 0;
exit;
end;
len1 := Li1.Count - 1;
len2 := Li2.Count - 1;
If len1 <> len2 Then
begin
test_lists := 0;
exit;
end;
lists_equal := 1;
For i := 0 To len1 Do
begin
If integer(Li1.items[i]) <> integer(Li2.items[i]) Then
begin
lists_equal := 0;
break;
end;
end;
If lists_equal = 0 Then
begin
test_lists := 0;
end
else
test_lists := len1;
end;
var
ITER, i, result: integer;
begin
if ParamCount = 0 then
ITER := 1
else
ITER := StrToInt(ParamStr(1));
if ITER < 1 then ITER := 1;
For i := 1 To ITER Do result := test_lists;
Writeln (IntToStr(result));
end.