Advertisement
ArinaRaguzina

window

Jan 20th, 2019
107
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pascal 2.80 KB | None | 0 0
  1. program task3;
  2.  
  3. type
  4.   PDec = ^TDec;
  5.   Tnode = record
  6.     index, NData: integer;
  7.   end;
  8.   TDec = record
  9.     size, maxSize: integer;
  10.     head, tail: integer;
  11.     Data: array of tnode;
  12.   end;
  13.  
  14.   function newArrayQueue(maxSize: integer): PDec;
  15.   var
  16.     P: Pdec;
  17.   begin
  18.     new(p);
  19.     if (p = nil) then
  20.       exit(nil);
  21.     p^.maxsize := maxsize;
  22.     try
  23.       SetLength(P^.Data, maxSize);
  24.     except
  25.       dispose(p);
  26.       exit(nil);
  27.     end;
  28.     p^.head := 0;
  29.     p^.size := 0;
  30.     p^.tail := 0;
  31.     exit(p);
  32.   end;
  33.  
  34.   function pushData(Dec: Pdec; const Data, index: integer): boolean;
  35.   begin
  36.     if Dec^.size = Dec^.maxsize then
  37.       exit(False);
  38.     if dec^.size = 0 then
  39.        Dec^.tail := Dec^.head mod Dec^.maxSize;
  40.     Dec^.size+=1;
  41.     Dec^.head := Dec^.size mod Dec^.maxSize - 1;
  42.     Dec^.Data[Dec^.head].NData := Data;
  43.     Dec^.Data[Dec^.head].index := index;
  44.  
  45.   end;
  46.  
  47.   function popDatahead(Dec: PDec): boolean;
  48.   begin
  49.     if (Dec^.size = 0) then
  50.       exit(False);
  51.     Dec^.size -= 1;
  52.     Dec^.head := Dec^.head mod Dec^.maxsize - 1;
  53.   end;
  54.  
  55.   function popDatatail(Dec: PDec): boolean;
  56.   begin
  57.     if (Dec^.size = 0) then
  58.       exit(False);
  59.     Dec^.size -= 1;
  60.     Dec^.tail := Dec^.tail mod Dec^.maxsize + 1;
  61.   end;
  62.  
  63.   function getData(Dec: PDec): integer;
  64.   begin
  65.     exit(Dec^.Data[Dec^.tail].ndata);
  66.   end;
  67.  
  68. var
  69.   p, p1: PDec;
  70.   ans:tnode;
  71.   n, i, k, d, t, prov: integer;
  72.   m, min: array [1..1000] of integer;
  73. begin
  74.  
  75.   Assign(input, 'input.txt');
  76.   Assign(output, 'output.txt');
  77.   reset(input);
  78.   rewrite(output);
  79.   readln(n, k);
  80.   p := newArrayQueue(n + 2);
  81.   p1 := newArrayQueue(n + 2);
  82.   t := 2;
  83.   for i := 1 to n do
  84.   begin
  85.     Read(m[i]);
  86.   end;
  87.   pushdata(p, m[1], 1 );
  88.   pushdata(p1, m[1], 1);
  89.   Write(m[1]);
  90.   min[1] := m[1];
  91.   for i := 2 to n do
  92.   begin
  93.     d := m[i];
  94.     while (p^.size > 0) and (p^.Data[p^.head].ndata < d) do
  95.       PopDataHead(p);
  96.     while (p1^.size > 0) and (p1^.Data[p1^.head].ndata  > d) do
  97.       PopDataHead(p1);
  98.     if p^.size = 0 then
  99.     begin
  100.       p^.head := 0;
  101.       p^.tail := 0;
  102.     end;
  103.     if p1^.size = 0 then
  104.     begin
  105.       p1^.head := 0;
  106.       p1^.tail := 0;
  107.     end;
  108.     PushData(p, m[i], i);
  109.     PushData(p1, m[i], i);
  110.     if p^.data[p^.tail].index < (i - k + 1) then
  111.       PopDataTail(p);
  112.     if  p1^.data[p^.tail].index < (i - k + 1) then
  113.       PopDataTail(p1);
  114.     prov := GeTdata(p);
  115.     Write(GeTdata(p));
  116.     min[t] := GeTdata(p1);
  117.     t += 1;
  118.   end;
  119.   t -= 1;
  120.   if m[n - 1] > m[n] then
  121.     Write(m[n - 1])
  122.   else
  123.     Write(m[n]);
  124.   Write(m[n]);
  125.   if m[n - 1] < m[n] then
  126.     min[t + 1] := m[n - 1]
  127.   else
  128.     min[t + 1] := m[n];
  129.   min[t + 2] := m[n];
  130.   writeln;
  131.   for i := 1 to t + 2 do
  132.   begin
  133.     Write(min[i]);
  134.   end;
  135.   Close(input);
  136.   Close(output);
  137. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement