На каждой смене в школьную столовую выстраивается очередь из воспитанников. У

На каждой смене в школьную столовую выстраивается очередь из воспитанников. У каждого из них есть при для себя некоторая сумма средств, которую он готов истратить. Чтоб лучше спланировать работу столовой, кулинара периодически хотят знать, сколько суммарно средств есть у нескольких заключительных человек, стоящих в очереди. Задачку осложняет то, что время от времени воспитанникам, которые стоят в самом конце, досаждает ожидать и они уходят.
Напишите программку, которая поможет столовой планировать свою работу.
Формат входного файла
Первой строчкой входного файла задано число n (1 n 100000) число операций с очередью. В следующих строчках описаны операции, по одной в строке. Они закодированы следующим образом: +x (1 x 109) добавить воспитанника с суммой средств x в конец очереди, - nbsp; удалить заключительного ученика из очереди, ?k (1 k длина очереди) вывести сумму средств, которая есть у заключительных k человек в очереди. Перед началом работы столовой очередь пуста, все операции во входном файле корректны.
Формат выходного файла
Для каждого запроса - выведите в отдельной строке сколько было средств у только что ушедшего воспитанника. Для запроса ?k выведите в отдельной строке сумму средств у последних k воспитанников.

Задать свой вопрос
1 ответ
Поступающие совместно с запросами + значения можно прибавлять в стек. Если запросы ? обрабатывать суммированием частей в этом стеке, то получится метод со сложностью O(N2), который набирает 75 баллов. Потому нужно завести 2-ой стек, где i-й элемент бережёт суммы чисел из первого стека от начала до i-го элемента. Тогда результатом запроса ? будет разница 2-ух чисел из второго стека. Сложность такового алгоритма сочиняет O(N).
var
nbsp;nbsp;c: char;
nbsp;nbsp;n, i, count, k: integer;
nbsp;nbsp;sum, x: array[0..100000] of int64;
begin
nbsp;nbsp;assign(input, input.txt);
nbsp;nbsp;reset(input);
nbsp;nbsp;assign(output, output.txt);
nbsp;nbsp;rewrite(output);
nbsp;nbsp;readln(n);
nbsp;nbsp;for i:=1 to n do begin
nbsp;nbsp;nbsp;nbsp;read(c);
nbsp;nbsp;nbsp;nbsp;if c = - then begin
nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;writeln(x[count]);
nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;dec(count);
nbsp;nbsp;nbsp;nbsp;end else if c = + then begin
nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;inc(count);
nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;read(x[count]);
nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;sum[count]:=sum[count - 1] + x[count];
nbsp;nbsp;nbsp;nbsp;end else if c = ? then begin
nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;read(k);
nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;writeln(sum[count] - sum[count - k]);
nbsp;nbsp;nbsp;nbsp;end;
nbsp;nbsp;nbsp;nbsp;readln;
nbsp;nbsp;end;
end.
, оставишь ответ?
Имя:*
E-Mail:


Последние вопросы

Добро пожаловать!

Для того чтобы стать полноценным пользователем нашего портала, вам необходимо пройти регистрацию.
Зарегистрироваться
Создайте собственную учетную запить!

Пройти регистрацию
Авторизоваться
Уже зарегистрированны? А ну-ка живо авторизуйтесь!

Войти на сайт