(我又来了)
思路:两次单调栈, fi 表示正在寻找第一个比它大的元素的下标, se 表示正在寻找第二个比它大的元素的下标。
#include<bits/stdc++.h>
using namespace std;
int n,a[100005],f[100005];
stack<int> fi,se;
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
for(int i=1;i<=n;i++){
while(!se.empty()&&a[se.top()]<a[i]){
f[se.top()]=a[i];
se.pop();
}
while(!fi.empty()&&a[fi.top()]<a[i]){
se.push(fi.top());
fi.pop();
}
fi.push(i);
}
while(!fi.empty()){
f[fi.top()]=-1;
fi.pop();
}
while(!se.empty()){
f[se.top()]=-1;
se.pop();
}
for(int i=1;i<=n;i++){
printf("%d ",f[i]);
}
return 0;
}