Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- program task3;
- type
- PDec = ^TDec;
- Tnode = record
- index, NData: integer;
- end;
- TDec = record
- size, maxSize: integer;
- head, tail: integer;
- Data: array of tnode;
- end;
- function newArrayQueue(maxSize: integer): PDec;
- var
- P: Pdec;
- begin
- new(p);
- if (p = nil) then
- exit(nil);
- p^.maxsize := maxsize;
- try
- SetLength(P^.Data, maxSize);
- except
- dispose(p);
- exit(nil);
- end;
- p^.head := 0;
- p^.size := 0;
- p^.tail := 0;
- exit(p);
- end;
- function pushData(Dec: Pdec; const Data, index: integer): boolean;
- begin
- if Dec^.size = Dec^.maxsize then
- exit(False);
- if dec^.size = 0 then
- Dec^.tail := Dec^.head mod Dec^.maxSize;
- Dec^.size+=1;
- Dec^.head := Dec^.size mod Dec^.maxSize - 1;
- Dec^.Data[Dec^.head].NData := Data;
- Dec^.Data[Dec^.head].index := index;
- end;
- function popDatahead(Dec: PDec): boolean;
- begin
- if (Dec^.size = 0) then
- exit(False);
- Dec^.size -= 1;
- Dec^.head := Dec^.head mod Dec^.maxsize - 1;
- end;
- function popDatatail(Dec: PDec): boolean;
- begin
- if (Dec^.size = 0) then
- exit(False);
- Dec^.size -= 1;
- Dec^.tail := Dec^.tail mod Dec^.maxsize + 1;
- end;
- function getData(Dec: PDec): integer;
- begin
- exit(Dec^.Data[Dec^.tail].ndata);
- end;
- var
- p, p1: PDec;
- ans:tnode;
- n, i, k, d, t, prov: integer;
- m, min: array [1..1000] of integer;
- begin
- Assign(input, 'input.txt');
- Assign(output, 'output.txt');
- reset(input);
- rewrite(output);
- readln(n, k);
- p := newArrayQueue(n + 2);
- p1 := newArrayQueue(n + 2);
- t := 2;
- for i := 1 to n do
- begin
- Read(m[i]);
- end;
- pushdata(p, m[1], 1 );
- pushdata(p1, m[1], 1);
- Write(m[1]);
- min[1] := m[1];
- for i := 2 to n do
- begin
- d := m[i];
- while (p^.size > 0) and (p^.Data[p^.head].ndata < d) do
- PopDataHead(p);
- while (p1^.size > 0) and (p1^.Data[p1^.head].ndata > d) do
- PopDataHead(p1);
- if p^.size = 0 then
- begin
- p^.head := 0;
- p^.tail := 0;
- end;
- if p1^.size = 0 then
- begin
- p1^.head := 0;
- p1^.tail := 0;
- end;
- PushData(p, m[i], i);
- PushData(p1, m[i], i);
- if p^.data[p^.tail].index < (i - k + 1) then
- PopDataTail(p);
- if p1^.data[p^.tail].index < (i - k + 1) then
- PopDataTail(p1);
- prov := GeTdata(p);
- Write(GeTdata(p));
- min[t] := GeTdata(p1);
- t += 1;
- end;
- t -= 1;
- if m[n - 1] > m[n] then
- Write(m[n - 1])
- else
- Write(m[n]);
- Write(m[n]);
- if m[n - 1] < m[n] then
- min[t + 1] := m[n - 1]
- else
- min[t + 1] := m[n];
- min[t + 2] := m[n];
- writeln;
- for i := 1 to t + 2 do
- begin
- Write(min[i]);
- end;
- Close(input);
- Close(output);
- end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement