class Solution {
public:
    vector<int> solve(vector<int>&a) { 
        //ans用来存最后的答案,f数组用来存后面要入栈的剩余元素中的最大值
        //倒序处理最大值
        vector<int> ans,f(a.size());
        stack<int> stack1;
        //先让f数组的最后一个元素的值为无穷小
        //再从f数组倒数第二位开始填写
        //倒序将f数组和a数组从最后一位开始进行逐位比较,选出两者中的最大值放在f的前一位
        //这样f[i]数组记录的就是a数组的后i+1位的最大值
        f[a.size()-1]=INT_MIN;
        for(int i=a.size()-2;i>=0;i--){
            f[i]=max(f[i+1],a[i+1]);
        }
        for(int i=0;i<=a.size()-1;i++){
            //如果即将入栈的元素比后面还没入栈的元素中的最大值还要大,就说明这个元素是最大的
            //就记在ans中,并更新lastmax(用来记录后面还没入站的元素中的最大值)
            //再将栈内的元素与lastmax进行比较,如果比它大,就出栈,记在ans里
            if(a[i]>f[i]){
                ans.push_back(a[i]);
                int lastmax=f[i];
                while(!stack1.empty()&&stack1.top()>lastmax){
                    ans.push_back(stack1.top());
                    stack1.pop();
                }
            }else{
         //如果即将入栈的a数组的这个元素比后面剩余要入栈的元素中的最大值要小,就将该元素入栈
                stack1.push(a[i]);
            }
        }
        //最后如果栈非空,就按顺序出栈,记在答案ans中 
        while(!stack1.empty()){
            ans.push_back(stack1.top());
                stack1.pop();
        
        }
        return ans;
    }
};