program Sort_Marge;
type massiv=array[1..100] of integer;
var n, i: integer;
 A: massiv;
 
procedure Merge(var A: massiv; first, last: integer);
var middle, start, final , j: integer;
 mas: massiv;
begin
 middle:=(first+last) div 2;
 start:=first;
 final:=middle+1;
for j:=first to last do
if (start<=middle) and ((final>last) or (A[start]<A[final])) then
begin
 mas[j]:=A[start];
 inc(start);
end
else
begin
 mas[j]:=A[final];
 inc(final);
end;

for j:=first to last do A[j]:=mas[j];
end;

procedure MergeSort(var A: massiv; first, last: integer);
begin
if first<last then
begin
 MergeSort(A, first, (first+last) div 2);
 MergeSort(A, (first+last) div 2+1, last);
 Merge(A, first, last);
end;
end;


begin
 cls;

n:=random(20)+10;
for i:=1 to n do A[i]:=random(60);
 write('Исходный массив: ');
for i:=1 to n do write(A[i], ' '); writeln();

MergeSort(A, 1, n);
write('Упорядоченный массив по возрастанию: ');
for i:=1 to n do write(A[i], ' ');    writeln();
write('Упорядоченный массив по убыванию: ');
for i:=n downto 1 do write(A[i], ' '); writeln();
end.