单调栈

求元素右侧第一个大于他的元素的下标(Luogu-P5788)。

void solve() {
  int n;
  cin >> n;
  vector<int> a(n);
  for (auto &i : a) {
    cin >> i;
  }
  stack<int> s;
  vector<int> ans(n);
  for (int i = n - 1; i >= 0; --i) {
    while (!s.empty() && a[s.top()] <= a[i]) {
      s.pop();
    }
    ans[i] = s.empty() ? -1 : s.top();
    s.push(i);
  }
  for (auto i : ans) {
    cout << i + 1 << ' ';
  }
}