单调栈存放下标,详情见注释

#include<iostream>
#include<algorithm>
#include<vector>
#include<stack>
#include<string>
using namespace std;
int arr[3000010] = { 0 };
int ans[3000010] = { 0 };
int main()
{
    stack<int>v;
    int n,p;
    cin >> n;
    p = n-1;//从末尾开始
    for (int i = 0; i < n; i++)
    {
        cin >> arr[i];
    }
    arr[n] = 9999999999;
    v.push(n);//放入最大数栈底
    for (int i = n-1; i >= 0; i--)
    {
        while (1)
        {
            if (arr[i] < arr[v.top()])//如果小于栈顶下标元素
            {
                ans[p] = v.top();//存答案
                p--;
                v.push(i);//存当前下标
                break;
            }
            else//否则弹出栈顶,继续比较下一栈顶,直到预存的最大
            {
                v.pop();
            }
        }
    }
    for (int i = 0; i < n; i++)//输出答案
    {
        if (ans[i] == n)
        {
            cout << 0 << " ";
        }
        else
        {
            cout << ans[i]+1 << " ";
        }
    }