#include <cstddef>
#include <vector>

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param num int整型vector 
     * @param size int整型 
     * @return int整型vector
     */
    vector<int> maxInWindows(vector<int>& num, int size) {
        // write code here
        std::vector<int> maxNumList;
        std::vector<int> storedNode;
        if (num.size() < size or size == 0){
            return maxNumList;
        }
        if (num.size() == 1 or size == 1){
            return num;
        }
        for (int start_pivot = 0; start_pivot <= num.size()-size; start_pivot++){
            std::vector<int> window(size);
            std::copy(num.begin()+start_pivot, num.begin()+start_pivot+size, window.begin());
            if (start_pivot == 0){
                int max = window[0];
                storedNode = initStoredNode(window, max);
                maxNumList.push_back(max);
            }else{
                maxNumList.push_back(findMaxInList(storedNode, window));
            }
        }
        return maxNumList;
    }

    vector<int> initStoredNode(vector<int>& window, int& max){
        vector<int> storedNode;
        for (int i = 0; i < window.size(); i++){
            if (max < window[i]){
                max = window[i];
            }
            if (i < window.size()-1 and window[i] >= window[i+1] and i != 0){
                storedNode.push_back(window[i]);
            }
        }
        storedNode.push_back(window[window.size()-1]);
        return storedNode;
    }

    int findMaxInList(vector<int>& storedNode, vector<int>& window){
        int max = window[window.size()-1];
        for (auto &elem : storedNode){
           if (elem >= max){
                max = elem;
           }
        }
        if (storedNode[0] == window[0]){
            storedNode.erase(storedNode.begin());
        }
        if (storedNode[storedNode.size()-1] < window[window.size()-1]){
            storedNode.erase(storedNode.end()-1);
        }
        storedNode.push_back(window[window.size()-1]);

        return max;
    }
};