思路就是单调递减栈。
#include <bits/stdc++.h>
#pragma GCC optimize(2)
#pragma GCC optimize(3)
#define MaxN 3000010
using namespace std;
typedef long long LL;
LL nums[MaxN],flag[MaxN],n;
stack <LL> st;
int main(){
scanf("%lld",&n);
for(int i=1; i<=n; i++)
scanf("%lld",&nums[i]);
for(int i=1; i<=n; i++){
if( st.empty() ) st.push(nums[i]);
else if( st.top() < nums[i] ){
while( !st.empty() && st.top() < nums[i] ){
flag[st.top()]=i;
st.pop();
}
st.push(nums[i]);
}
else st.push(nums[i]);
}
while( !st.empty() ){
flag[st.top()]=0;
st.pop();
}
for(int i=1; i<=n; i++)
printf("%lld ",flag[nums[i]]);
return 0;
}