{$MODE OBJFPC}
type
proc1 = procedure(var x: array of integer);
proc2 = procedure(var x, y: integer);
generic swtable<T> = array[boolean] of T;
generic P<T> = class(TObject) public class function switch(x: array of T): specialize swtable<T>; static; end;
P1 = specialize P<proc1>;
P2 = specialize P<proc2>;
class function P.switch(x: array of T): specialize swtable<T>; begin switch := x end;
procedure nop2(var x, y: integer); begin end;
procedure swap(var x, y: integer); begin x := x xor y; y:= y xor x; x := x xor y end;
procedure nop1(var arr: array of integer); begin end;
procedure inner_sort(var arr: array of integer);
begin
P2.switch([@nop2, @swap])[arr[0] > arr[1]](arr[0], arr[1]);
P1.switch([@nop1, @inner_sort])[length(arr) > 2](arr[1 .. High(arr)])
end;
procedure sort(var arr: array of integer);
begin
P1.switch([@inner_sort, @nop1])[length(arr) < 1](arr);
P1.switch([@nop1, @sort])[length(arr) > 2](arr[0 .. High(arr) - 1])
end;
procedure print_array(arr: array of integer);
var
i: integer;
begin
for i := Low(arr) to High(arr) do Write(arr[i], ' ');
Writeln
end;
var
x : array[-2 .. 2] of integer = (100500, 265, 1488, 666, 13);
begin
sort(x);
print_array(x)
end.
eyRNT0RFIE9CSkZQQ30KdHlwZQogIHByb2MxID0gcHJvY2VkdXJlKHZhciB4OiBhcnJheSBvZiBpbnRlZ2VyKTsKICBwcm9jMiA9IHByb2NlZHVyZSh2YXIgeCwgeTogaW50ZWdlcik7CiAgZ2VuZXJpYyBzd3RhYmxlPFQ+ID0gYXJyYXlbYm9vbGVhbl0gb2YgVDsKICBnZW5lcmljIFA8VD4gPSBjbGFzcyhUT2JqZWN0KSBwdWJsaWMgY2xhc3MgZnVuY3Rpb24gc3dpdGNoKHg6IGFycmF5IG9mIFQpOiBzcGVjaWFsaXplIHN3dGFibGU8VD47IHN0YXRpYzsgZW5kOwogIFAxID0gc3BlY2lhbGl6ZSBQPHByb2MxPjsKICBQMiA9IHNwZWNpYWxpemUgUDxwcm9jMj47CgpjbGFzcyBmdW5jdGlvbiBQLnN3aXRjaCh4OiBhcnJheSBvZiBUKTogc3BlY2lhbGl6ZSBzd3RhYmxlPFQ+OyBiZWdpbiBzd2l0Y2ggOj0geCBlbmQ7Cgpwcm9jZWR1cmUgbm9wMih2YXIgeCwgeTogaW50ZWdlcik7IGJlZ2luIGVuZDsKcHJvY2VkdXJlIHN3YXAodmFyIHgsIHk6IGludGVnZXIpOyBiZWdpbiB4IDo9IHggeG9yIHk7IHk6PSB5IHhvciB4OyB4IDo9IHggeG9yIHkgZW5kOwoKcHJvY2VkdXJlIG5vcDEodmFyIGFycjogYXJyYXkgb2YgaW50ZWdlcik7IGJlZ2luIGVuZDsKCnByb2NlZHVyZSBpbm5lcl9zb3J0KHZhciBhcnI6IGFycmF5IG9mIGludGVnZXIpOwogIGJlZ2luCiAgICBQMi5zd2l0Y2goW0Bub3AyLCBAc3dhcF0pW2FyclswXSA+IGFyclsxXV0oYXJyWzBdLCBhcnJbMV0pOwogICAgUDEuc3dpdGNoKFtAbm9wMSwgQGlubmVyX3NvcnRdKVtsZW5ndGgoYXJyKSA+IDJdKGFyclsxIC4uIEhpZ2goYXJyKV0pCiAgZW5kOwoKcHJvY2VkdXJlIHNvcnQodmFyIGFycjogYXJyYXkgb2YgaW50ZWdlcik7CiAgYmVnaW4KICAgIFAxLnN3aXRjaChbQGlubmVyX3NvcnQsIEBub3AxXSlbbGVuZ3RoKGFycikgPCAxXShhcnIpOwogICAgUDEuc3dpdGNoKFtAbm9wMSwgQHNvcnRdKVtsZW5ndGgoYXJyKSA+IDJdKGFyclswIC4uIEhpZ2goYXJyKSAtIDFdKQogIGVuZDsKCnByb2NlZHVyZSBwcmludF9hcnJheShhcnI6IGFycmF5IG9mIGludGVnZXIpOwogIHZhcgogICAgaTogaW50ZWdlcjsKICBiZWdpbgogICAgZm9yIGkgOj0gTG93KGFycikgdG8gSGlnaChhcnIpIGRvIFdyaXRlKGFycltpXSwgJyAnKTsKICAgIFdyaXRlbG4KICBlbmQ7Cgp2YXIKICB4IDogYXJyYXlbLTIgLi4gMl0gb2YgaW50ZWdlciA9ICgxMDA1MDAsIDI2NSwgMTQ4OCwgNjY2LCAxMyk7CmJlZ2luCiAgc29ydCh4KTsKICBwcmludF9hcnJheSh4KQplbmQu