单调栈
求元素右侧第一个大于他的元素的下标(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 << ' ';
}
}