class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums intvector 
     * @return intvector<vector<>>
     */
    /*
    理解去记忆
    while(栈空或者curr > top) {
        top的下一个最大值就是curr
        push到ret中
    }
    将curr push到stack中。
    return ret
    staMax, staMin.
    一个一个的算,先算staMax
    
    */
    vector<vector<int> > foundMonotoneStack(vector<int>& nums) {
        int len = nums.size();
        stack<int> staRight, staLeft;
        vector<int> vecRight (len, -1);
        vector<int> vecLeft (len, -1);
        vector<vector<int>> ret (len, vector<int> (2, -1));
        
        // 右面第一个比它小 
        for (int i = 0; i < len; i++) {
            while(!staRight.empty() && nums[i] < nums[staRight.top()]) {
                ret[staRight.top()][1] = i;
                staRight.pop();
            }
            staRight.push(i);            
        }
        // 左面第一个比它小
       for(int i = 0; i < len; i++) {
           while(!staLeft.empty() && nums[i] <= nums[staLeft.top()]) {
               staLeft.pop();
           }
           if (!staLeft.empty()) {
               ret[i][0] = staLeft.top();
           }
           staLeft.push(i);
       }
        return ret;
    }
};