建立一个大小为size的大顶堆head; 窗口i与窗口i+1的联系为,将窗口i中的第1个元素,修改为窗口i+1中的最后一个元素,即head[start+(i+size)%size]=num[i+size],然后更新堆即可,因为只改了一个位置,所以只要更新这个位置的祖先即可

#include<bits/stdc++.h>
using namespace std;
class Solution {
public:
    void output(vector<int>& windows){
        for(auto it:windows){
            cout<<it<<" ";
        }
        cout<<endl;
    }
    void initial(int h,vector<int>& windows){
        h--;
        while(h){
            int start=(1<<(h-1));
            for(int i=0;i<(1<<(h-1));i++){
                int pos=i+start;
                windows[pos]=max(windows[pos*2],windows[pos*2+1]);
            }
            h--;
        }
        
    }
    int getPos(int i,int size){
        return i%size;
    }
    void adjust(int pos,int val,int h,vector<int>& windows){
        windows[pos]=val;
        while(pos!=1){
            pos/=2;            
            windows[pos]=max(windows[pos*2],windows[pos*2+1]);
        }
    }
    vector<int> maxInWindows(const vector<int>& nums, int size) {
        int h=0;
        int temp=size;
        while(temp){
            temp/=2;
            h++;
        }
        h++;
        cout<<h<<endl;
        vector<int> windows(1<<h,0);
        int start = (1<<(h-1));
        for(int i=0;i<size;i++){
            windows[i+start]=nums[i];
        }
        output(windows);
        
        initial(h,windows);
        output(windows);
        
        vector<int> ans;
        ans.emplace_back(windows[1]);
        for(int i=size;i<nums.size();i++){
            adjust(getPos(i,size)+start,nums[i],h,windows);
            ans.emplace_back(windows[1]);
        }
        return ans;
        //initial
        
        
    }
};