Использовать обычную структуру стека и дополнительный массив для счетчиков.
int c[1..1000]
и переменная int maxVal=0
.
В коде добавить действия после стековых операций:
On push(x) -> c[x]++ ; maxVal = max(x,maxVal)
On pop():x -> c[x]-- ; if (c[x] == 0) { j=x; while(c[--j] == 0); maxVal = j; }
maxVal должно всегда иметь максимальное значение.
Может быть, я ошибаюсь, это должно было амортизировать вычислительную сложность O (1).
Прошло много времени с тех пор, как я анализировал алгоритмы.