printРешение

Тема: моделирование
Сложность: средняя

Если использовать тип shortint (целое от 128 до 127) вместо обычного integer, то можно хранить значения всех измерений (100 x 100000 байт < 32Мб), поступивших от ИБП. Но фактически необходимы только `M` последних значений, которые удобно хранить в кольцевом буфере размера `M`. Также необходимо хранить количество значений меньше и равных `L` в буфере и их сумму. При поступлении очередного измерения от `j`-го ИБП изменяется только сумма и количество для `j`-го ИБП, предыдущее значение удаляется и вычитается из суммы, а новое записывается на его место в кольцевом буфере и прибавляется к сумме. Указатель буфера смещается на следующую позицию.
var N,L,M,K,i,j,p,b:integer;
  q:array[1..100,1..100] of integer;
  ki,li,si:array[1..100] of integer;
begin
  read(N,L,M,K);
  for i:=1 to N do
  begin
    ki[i]:=1;
    li[i]:=0;
    si[i]:=100*M;
    for j:=1 to M do
      q[i,j]:=100;
  end;
  for i:=1 to K do
  begin
    read(j,p);
    si[j]:=si[j]-q[j,ki[j]];
    if q[j,ki[j]]<=L then
      dec(li[j]);
    si[j]:=si[j]+p;
    if p<=L then
      inc(li[j]);
    q[j,ki[j]]:=p;
    inc(ki[j]);
    if ki[j]>M then
      ki[j]:=1;
    b:=0;
    for j:=1 to N do
    begin
      if li[j]=M then
      begin
        if b=0 then
          b:=j
        else if si[j]<si[b] then
          b:=j;
      end;
    end;
    writeln(b);
  end;
end.
loading