class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 栈排序
     * @param a int整型vector 描述入栈顺序
     * @return int整型vector
     */
    vector<int> solve(vector<int>& a) {
        int size = a.size();
        vector<int> ans, pre(size);
        
        stack<int> stk;
        pre[size-1] = INT_MIN;   
        for(int i=size-2; i>=0; i--){  //得到每一个数对应的后面的最大值,在进行入栈操作时,若本数大于辅助数组对应的数即后面出现的最大的数,则进入答案数组。若不大于,入栈,栈中一直是当前非数组中非最大的数;保证了进入的是当前剩余的最大的数;
            pre[i] = max(pre[i+1], a[i+1]);
        }
        
        for(int i=0; i<size; i++){
            if(a[i] > pre[i]){  //本数是当前剩余的最大数
                ans.push_back(a[i]);
                int lastMax = pre[i];

                while(!stk.empty() && stk.top() > lastMax){  //反过来处理栈, 因为最大数改变了,栈中的元素可能变成当前最大数;
                    ans.push_back(stk.top());
                    stk.pop();
                }
            }else{
                stk.push(a[i]);
            }
        }

        while(!stk.empty()){  //最后处理剩余,栈里是递增排序的;
            ans.push_back(stk.top());
            stk.pop();
        }

        return ans;
    }
};