program WarmerDays;
{$mode objfpc}{$H+}
procedure PrintArray(const arr: array of Integer);
var
i: Integer;
begin
for i := 0 to High(arr) do
Write(arr[i], ' ');
WriteLn;
end;
procedure NumberOfDaysToWait(const temperatures: array of Integer;
out resultArr: array of Integer);
var
size: Integer;
stack: array of Integer;
top: Integer;
i, idx: Integer;
begin
size := Length(temperatures);
SetLength(stack, size);
top := -1;
for i := 0 to size - 1 do
begin
while (top >= 0) and (temperatures[i] > temperatures[stack[top]]) do
begin
idx := stack[top];
Dec(top);
resultArr[idx] := i - idx;
end;
Inc(top);
stack[top] := i;
end;
while top >= 0 do
begin
resultArr[stack[top]] := 0;
Dec(top);
end;
end;
var
temperatures: array of Integer;
resultArr: array of Integer;
begin
temperatures := [82, 84, 81, 58, 85, 89, 75, 71];
SetLength(resultArr, Length(temperatures));
// 82 -> 84 = 1
// 84 -> 81 -> 58 -> 85 = 3
// 81 -> 58 -> 85 = 2
// 58 -> 85 = 1
// 85 -> 89 = 1
// 89 -> 75 -> 71 = 0
// 75 -> 71 = 0
NumberOfDaysToWait(temperatures, resultArr);
PrintArray(resultArr);
end.
(*
run:
1 3 2 1 1 0 0 0
*)