和单调队列类似,保证id和val的单调性即可,但入栈和出栈是同一边。
**它用于 解决:**可以从左/右遍历第一个比它小/大的元素的位置
P5788 【模板】单调栈
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=3e6+10;
struct node{
int id;ll x;
}a[maxn];
ll s[maxn];
stack<node> q;
int main(){
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%lld",&a[i].x);
a[i].id=i;
while(!q.empty()&&q.top().x<a[i].x)s[q.top().id]=a[i].id,q.pop();
q.push(a[i]);
}
for(int i=1;i<=n;i++){
cout<<s[i]<<" ";
}
return 0;
}