// 最后一个 >= a[i] 的数的位置
// 右边第一个 < a[i] 的数的位置
int cnt;
q[1] = n + 1;
cnt = 1;
a[n + 1] = -INF;
for (int i = n; i >= 1; i--) {
while (cnt && a[q[cnt]] >= a[i])
cnt--;
f1[i] = q[cnt] - 1;
q[++cnt] = i;
}
// 左边第一个 < a[i] 的数的位置
q[1] = 0;
cnt = 1;
a[0] = -INF;
for (int i = 1;i <= n;i++) {
while (cnt && a[q[cnt]] >= a[i])
cnt--;
f2[i] = q[cnt] + 1;
q[++cnt] = i;
}
// 最后一个 <= a[i] 的数的位置
// 右边第一个 > a[i] 的数的位置
int cnt;
q[1] = n + 1;
cnt = 1;
a[n + 1] = INF;
for (int i = n; i >= 1; i--) {
while (cnt && a[q[cnt]] <= a[i])
cnt--;
f1[i] = q[cnt] - 1;
q[++cnt] = i;
}
// 左边第一个 > a[i] 的数的位置
q[1] = 0;
cnt = 1;
a[0] = INF;
for (int i = 1;i <= n;i++) {
while (cnt && a[q[cnt]] <= a[i])
cnt--;
f2[i] = q[cnt] + 1;
q[++cnt] = i;
}