单调栈
int rear=0; for(int st=1;st<=N;st++) { while(rear>0&&H[que[rear]]>=H[st]) --rear; if(rear==0) le[st]=0; else le[st]=que[rear]; que[++rear]=st; }
单调队列
int que[maxn],elem[maxn]; int f=1,r=0; for(int i=1;i<K;i++) { while(r>=f&&elem[que[r]]>=elem[i]) --r; que[++r]=i; } for(int i=K;i<=N;i++) { while(r>=f&&elem[que[r]]>=elem[i]) --r; que[++r]=i; while(que[f]+K<=i) ++f; MIN[i-K]=elem[que[f]]; }