class Solution {
  public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param op string字符串vector
     * @param vals int整型vector<vector<>>
     * @return int整型vector
     */
    set<int> max;
    vector<int> mcstack;
    void push(int id, int weight) {
        max.insert(weight);
        mcstack.push_back(weight);
    }

    int getMax() {
        //end()指向后一个元素之后,这里用rbegin
        return *max.rbegin();
    }

    void pop() {
        max.erase(max.find(mcstack[mcstack.size() - 1]));
        mcstack.pop_back();
    }

    int top() {
        return mcstack[mcstack.size()-1];
    }

    vector<int> max_weight_cow(vector<string>& op, vector<vector<int> >& vals) {
        // write code here
        
        vector<int>res;
        int i = 0;
        for (auto x : op) {
            if (x == "MaxCowStack")res.push_back(-1);
            if (x == "pop")
            {
                res.push_back(-1);
                pop();
            }
            if (x == "push") {
                push(vals[i][0], vals[i][1]);
                res.push_back(-1);
            }
            if (x == "getMax")
            res.push_back(getMax());
            if (x == "top")
            res.push_back(top());
            i++;
        }
        return res;
    }};