Uses Crt; Type elemtype=integer; {запись} link =^node; node =record elem: elemtype; next: link; end; {очередь} queue=record next1: link; end; {дек} deck=record front: link; rear : link; end; Var a,b: queue; {две очереди для операций} c : deck; {исходный представление} N : integer;{количество чисел последовательности (после сложения)} min: integer;{минимальное число очереди} {Инициализация очереди с двумя ссылками} Procedure InitDeck(var q:deck); Begin GetMem(q.front,SizeOf(q.front)); q.front^.next:=nil; q.rear:=q.front; End; {Добавление 2*N элементов в дек} Procedure AddElementInDeck(q:deck); Var i: byte; x: elemtype; Begin for i:=1 to 2*N do begin x:=random(100)+1; writeln('Element №',i,'=',x); //readln(x); GetMem(q.rear^.next,SizeOf(q.rear^.next)); q.rear:=q.rear^.next; q.rear^.elem:=x; q.rear^.next:=nil; end; End; {Деление дека пополам, перестив их в обычные очереди} Procedure DivisionDeck(a,b:queue); Var adr,adr1,adr2: link; buf,i : integer; Begin {Выделяем под первые элементы очереди память} GetMem(a.next1,sizeof(a.next1)); GetMem(b.next1,sizeof(b.next1)); adr1:=a.next1; adr2:=b.next1; for i:=1 to 2*N do begin {перенос части в очередь а} if i<=5 then begin {переносим в ячейку число (очередь а) из дека} a.next1^.elem:=c.front^.elem; {запоминаем ссылку дека} adr:=c.front^.next; {переходим к следующей ссылке дека} c.front^.next:=c.front^.next^.next; {освобождаем память предыдущей ячейки, т.к. использовалии ее} {и она нам больше не потребуется в дальнейшем} FreeMem(adr,SizeOf(adr)); {выделяем память для нового элемента очереди а} GetMem(a.next1^.next,sizeof(a.next1^.next)); {заносим в нее ссылку} a.next1^.next:=a.next1^.next^.next; end {перенос части в очередь b} {операции с этой очередью аналогичны очереди а} else begin b.next1^.elem:=c.front^.elem; adr:=c.front^.next; c.front^.next:=c.front^.next^.next; FreeMem(adr,SizeOf(adr)); GetMem(b.next1^.next,sizeof(b.next1^.next)); b.next1^.next:=b.next1^.next^.next; end; end; a.next1^.next:=adr1; b.next1^.next:=adr2; End; {Сложение элементов очередей,при это результат суммы сохраняется заместо ячейки, в очереди а} Procedure PlusQueue(x1,x2:queue); Var adr,adr1: link; buf,i : integer; Begin {указатель на начало очереди} adr1:=a.next1; for i:=1 to N do begin {сумма двух элементов} buf:=x1.next1^.elem+x2.next1^.elem; x1.next1^.elem:=buf; {запоминаем ссылку дека} adr:=x2.next1^.next; {переходим к следующей ссылке дека} x1.next1^.next:=x1.next1^.next^.next; {освобождаем память предыдущей ячейки, т.к. использовалии ее} {и она нам больше не потребуется в дальнейшем} FreeMem(adr,SizeOf(adr)); {заносим в нее ссылку} x2.next1^.next:=x2.next1^.next^.next; end; {возвращаемся к началу очереди} a.next1^.next:=adr1; End; {Поиск минимума в очереди а} {Procedure FindMin(a:queue); Var i: byte; Begin min:=0; min:=a.next1^.elem; for i:=2 to N do begin if a.next1^.next^.elem