class MaxStack {
 public:
  void push(int x) {
    list.push_front(x);
    keyToIterators[x].push_back(list.begin());
  }
  int pop() {
    const int x = list.front();
    list.pop_front();
    auto& iterators = keyToIterators[x];
    iterators.pop_back();
    if (iterators.empty())
      keyToIterators.erase(x);
    return x;
  }
  int top() {
    return list.front();
  }
  int peekMax() {
    return keyToIterators.begin()->first;
  }
  int popMax() {
    const int x = peekMax();
    auto& iterators = keyToIterators.begin()->second;
    auto it = iterators.back();
    list.erase(it);
    iterators.pop_back();
    if (iterators.empty())
      keyToIterators.erase(keyToIterators.begin());
    return x;
  }
 private:
  std::list<int> list;
  map<int, vector<std::list<int>::iterator>, greater<>> keyToIterators;
};