#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> ii;
const int INF = 1e9;
const ll LINF = 1e18;
const int N = 5e5 + 5;
// Bài này ta sẽ sử dụng Stack cùng với MergeSort Tree (vector)
int n;
int a[N];
int l_less[N]; // l_less[i] = Phần tử gần nhất bên trái < a[i]
int r_less[N]; // r_less[i] = Phần tử gần nhất bên phải < a[i]
int l_greater[N]; // l_greater[i] = Phần tử gần nhất bên trái > a[i]
int r_greater[N]; // r_greater[i] = Phần tử gần nhất bên phải > a[i]
void precompute() {
vector<int> st;
for (int i = 1; i <= n; i++) {
while (!st.empty() && a[st.back()] >= a[i]) st.pop_back();
l_less[i] = st.empty() ? 0 : st.back();
st.push_back(i);
}
st.clear();
for (int i = n; i >= 1; i--) {
while (!st.empty() && a[st.back()] >= a[i]) st.pop_back();
r_less[i] = st.empty() ? n + 1 : st.back();
st.push_back(i);
}
st.clear();
for (int i = 1; i <= n; i++) {
while (!st.empty() && a[st.back()] <= a[i]) st.pop_back();
l_greater[i] = st.empty() ? 0 : st.back();
st.push_back(i);
}
st.clear();
for (int i = n; i >= 1; i--) {
while (!st.empty() && a[st.back()] <= a[i]) st.pop_back();
r_greater[i] = st.empty() ? n + 1 : st.back();
st.push_back(i);
}
}
vector<int> seg[4 * N]; // seg[id] = vector chứa các phần tử thuộc đoạn [l, r] do nút id quản lí, theo thứ tự tăng dần
void initTree() {
for (int id = 1; id <= 4 * n; id++) seg[id].clear();
}
// O(nlogn)
void build(int type, int id, int l, int r) {
if (l == r) {
seg[id].push_back(type ? r_greater[l] : l_greater[l]);
return;
}
int mid = (l + r) >> 1;
build(type, id * 2, l, mid);
build(type, id * 2 + 1, mid + 1, r);
merge(seg[id * 2].begin(), seg[id * 2].end(), seg[id * 2 + 1].begin(), seg[id * 2 + 1].end(), back_inserter(seg[id]));
}
// Đếm xem có bao nhiêu chỉ số i thuộc đoạn [u, v] sao cho l_greater[i] < x
// O(log^2(n))
int countLess(int id, int l, int r, int u, int v, int x) {
if (l > v || r < u) return 0;
if (u <= l && r <= v) {
int pos = lower_bound(seg[id].begin(), seg[id].end(), x) - seg[id].begin();
return pos;
}
int mid = (l + r) >> 1;
return countLess(id * 2, l, mid, u, v, x) + countLess(id * 2 + 1, mid + 1, r, u, v, x);
}
// Đếm xem có bao nhiêu chỉ số i thuộc đoạn [u, v] sao cho r_greater[i] > x
// O(log^2(n))
int countGreater(int id, int l, int r, int u, int v, int x) {
if (l > v || r < u) return 0;
if (u <= l && r <= v) {
int pos = upper_bound(seg[id].begin(), seg[id].end(), x) - seg[id].begin();
return seg[id].size() - pos;
}
int mid = (l + r) >> 1;
return countGreater(id * 2, l, mid, u, v, x) + countGreater(id * 2 + 1, mid + 1, r, u, v, x);
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> n;
for (int i = 1; i <= n; i++) cin >> a[i];
precompute();
// Ta sẽ đi đếm số đoạn [l, r] trong từng trường hợp sau:
// Trường hợp 1: a[l] đóng vai trò là min
// - Nhận xét: a[l] sẽ là min của đoạn [l, r] với r thuộc đoạn [l, r_less[l] - 1]
// => Với mỗi l, đếm có bao nhiêu r thuộc đoạn [l, r_less[l] - 1] sao cho a[r] là max của đoạn [l, r]
// => Với mỗi l, đếm có bao nhiêu r thuộc đoạn [l, r_less[l] - 1] sao cho l_greater[r] < l
// Fact: ta cũng đã đếm luôn những case l = r
initTree();
build(0, 1, 1, n);
ll ans = 0;
for (int l = 1; l <= n; l++) {
ans += countLess(1, 1, n, l, r_less[l] - 1, l);
} // O(nlog^2(n))
// Trường hợp 2: a[r] đóng vai trò là min
// - Nhận xét: a[r] sẽ là min của đoạn [l, r] với l thuộc đoạn [l_less[r] + 1, r]
// => Với mỗi r, đếm có bao nhiêu l thuộc đoạn [l_less[r] + 1, r] sao cho a[l] là max của đoạn [l, r]
// => Với mỗi r, đếm có bao nhiêu l thuộc đoạn [l_less[r] + 1, r] sao cho r_greater[l] > r
// Chú ý: Để tránh đếm trùng lại case l = r thì ta đếm trong đoạn [l_less[r] + 1, r - 1]
initTree();
build(1, 1, 1, n);
for (int r = 1; r <= n; r++) {
ans += countGreater(1, 1, n, l_less[r] + 1, r - 1, r);
} // O(nlog^2(n))
cout << ans << '\n';
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+IAoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsgIAoKdHlwZWRlZiBsb25nIGxvbmcgbGw7ICAKdHlwZWRlZiBwYWlyPGludCwgaW50PiBpaTsgIAoKY29uc3QgaW50IElORiA9IDFlOTsgIApjb25zdCBsbCBMSU5GID0gMWUxODsgIAoKY29uc3QgaW50IE4gPSA1ZTUgKyA1OyAKCi8vIELDoGkgbsOgeSB0YSBz4bq9IHPhu60gZOG7pW5nIFN0YWNrIGPDuW5nIHbhu5tpIE1lcmdlU29ydCBUcmVlICh2ZWN0b3IpCmludCBuOyAKaW50IGFbTl07IAppbnQgbF9sZXNzW05dOyAvLyBsX2xlc3NbaV0gPSBQaOG6p24gdOG7rSBn4bqnbiBuaOG6pXQgYsOqbiB0csOhaSA8IGFbaV0KaW50IHJfbGVzc1tOXTsgLy8gcl9sZXNzW2ldID0gUGjhuqduIHThu60gZ+G6p24gbmjhuqV0IGLDqm4gcGjhuqNpIDwgYVtpXQppbnQgbF9ncmVhdGVyW05dOyAvLyBsX2dyZWF0ZXJbaV0gPSBQaOG6p24gdOG7rSBn4bqnbiBuaOG6pXQgYsOqbiB0csOhaSA+IGFbaV0KaW50IHJfZ3JlYXRlcltOXTsgIC8vIHJfZ3JlYXRlcltpXSA9IFBo4bqnbiB04butIGfhuqduIG5o4bqldCBiw6puIHBo4bqjaSA+IGFbaV0KCnZvaWQgcHJlY29tcHV0ZSgpIHsKCXZlY3RvcjxpbnQ+IHN0OyAgCglmb3IgKGludCBpID0gMTsgaSA8PSBuOyBpKyspIHsKCQl3aGlsZSAoIXN0LmVtcHR5KCkgJiYgYVtzdC5iYWNrKCldID49IGFbaV0pIHN0LnBvcF9iYWNrKCk7ICAKCQlsX2xlc3NbaV0gPSBzdC5lbXB0eSgpID8gMCA6IHN0LmJhY2soKTsgICAKCQlzdC5wdXNoX2JhY2soaSk7ICAKCX0KCglzdC5jbGVhcigpOyAgIAoJZm9yIChpbnQgaSA9IG47IGkgPj0gMTsgaS0tKSB7CgkJd2hpbGUgKCFzdC5lbXB0eSgpICYmIGFbc3QuYmFjaygpXSA+PSBhW2ldKSBzdC5wb3BfYmFjaygpOyAgCgkJcl9sZXNzW2ldID0gc3QuZW1wdHkoKSA/IG4gKyAxIDogc3QuYmFjaygpOyAgIAoJCXN0LnB1c2hfYmFjayhpKTsgIAoJfQoKCXN0LmNsZWFyKCk7IAoJZm9yIChpbnQgaSA9IDE7IGkgPD0gbjsgaSsrKSB7CgkJd2hpbGUgKCFzdC5lbXB0eSgpICYmIGFbc3QuYmFjaygpXSA8PSBhW2ldKSBzdC5wb3BfYmFjaygpOyAgCgkJbF9ncmVhdGVyW2ldID0gc3QuZW1wdHkoKSA/IDAgOiBzdC5iYWNrKCk7ICAgCgkJc3QucHVzaF9iYWNrKGkpOyAgCgl9CgoJc3QuY2xlYXIoKTsgICAKCWZvciAoaW50IGkgPSBuOyBpID49IDE7IGktLSkgewoJCXdoaWxlICghc3QuZW1wdHkoKSAmJiBhW3N0LmJhY2soKV0gPD0gYVtpXSkgc3QucG9wX2JhY2soKTsgIAoJCXJfZ3JlYXRlcltpXSA9IHN0LmVtcHR5KCkgPyBuICsgMSA6IHN0LmJhY2soKTsgICAKCQlzdC5wdXNoX2JhY2soaSk7ICAKCX0KfQoKdmVjdG9yPGludD4gc2VnWzQgKiBOXTsgLy8gc2VnW2lkXSA9IHZlY3RvciBjaOG7qWEgY8OhYyBwaOG6p24gdOG7rSB0aHXhu5ljIMSRb+G6oW4gW2wsIHJdIGRvIG7DunQgaWQgcXXhuqNuIGzDrSwgdGhlbyB0aOG7qSB04buxIHTEg25nIGThuqduCgp2b2lkIGluaXRUcmVlKCkgewoJZm9yIChpbnQgaWQgPSAxOyBpZCA8PSA0ICogbjsgaWQrKykgc2VnW2lkXS5jbGVhcigpOyAgCn0KCi8vIE8obmxvZ24pCnZvaWQgYnVpbGQoaW50IHR5cGUsIGludCBpZCwgaW50IGwsIGludCByKSB7CglpZiAobCA9PSByKSB7CgkJc2VnW2lkXS5wdXNoX2JhY2sodHlwZSA/IHJfZ3JlYXRlcltsXSA6IGxfZ3JlYXRlcltsXSk7IAoJCXJldHVybjsKCX0KCWludCBtaWQgPSAobCArIHIpID4+IDE7ICAgCglidWlsZCh0eXBlLCBpZCAqIDIsIGwsIG1pZCk7ICAKCWJ1aWxkKHR5cGUsIGlkICogMiArIDEsIG1pZCArIDEsIHIpOyAgCgltZXJnZShzZWdbaWQgKiAyXS5iZWdpbigpLCBzZWdbaWQgKiAyXS5lbmQoKSwgc2VnW2lkICogMiArIDFdLmJlZ2luKCksIHNlZ1tpZCAqIDIgKyAxXS5lbmQoKSwgYmFja19pbnNlcnRlcihzZWdbaWRdKSk7IAp9CgovLyDEkOG6v20geGVtIGPDsyBiYW8gbmhpw6p1IGNo4buJIHPhu5EgaSB0aHXhu5ljIMSRb+G6oW4gW3UsIHZdIHNhbyBjaG8gbF9ncmVhdGVyW2ldIDwgeAovLyBPKGxvZ14yKG4pKQppbnQgY291bnRMZXNzKGludCBpZCwgaW50IGwsIGludCByLCBpbnQgdSwgaW50IHYsIGludCB4KSB7CglpZiAobCA+IHYgfHwgciA8IHUpIHJldHVybiAwOyAgCglpZiAodSA8PSBsICYmIHIgPD0gdikgewoJCWludCBwb3MgPSBsb3dlcl9ib3VuZChzZWdbaWRdLmJlZ2luKCksIHNlZ1tpZF0uZW5kKCksIHgpIC0gc2VnW2lkXS5iZWdpbigpOyAgICAKCQlyZXR1cm4gcG9zOwoJfQoJaW50IG1pZCA9IChsICsgcikgPj4gMTsgIAoJcmV0dXJuIGNvdW50TGVzcyhpZCAqIDIsIGwsIG1pZCwgdSwgdiwgeCkgKyBjb3VudExlc3MoaWQgKiAyICsgMSwgbWlkICsgMSwgciwgdSwgdiwgeCk7IAp9CgovLyDEkOG6v20geGVtIGPDsyBiYW8gbmhpw6p1IGNo4buJIHPhu5EgaSB0aHXhu5ljIMSRb+G6oW4gW3UsIHZdIHNhbyBjaG8gcl9ncmVhdGVyW2ldID4geAovLyBPKGxvZ14yKG4pKQppbnQgY291bnRHcmVhdGVyKGludCBpZCwgaW50IGwsIGludCByLCBpbnQgdSwgaW50IHYsIGludCB4KSB7CglpZiAobCA+IHYgfHwgciA8IHUpIHJldHVybiAwOyAgCglpZiAodSA8PSBsICYmIHIgPD0gdikgewoJCWludCBwb3MgPSB1cHBlcl9ib3VuZChzZWdbaWRdLmJlZ2luKCksIHNlZ1tpZF0uZW5kKCksIHgpIC0gc2VnW2lkXS5iZWdpbigpOyAgICAKCQlyZXR1cm4gc2VnW2lkXS5zaXplKCkgLSBwb3M7ICAKCX0KCWludCBtaWQgPSAobCArIHIpID4+IDE7ICAKCXJldHVybiBjb3VudEdyZWF0ZXIoaWQgKiAyLCBsLCBtaWQsIHUsIHYsIHgpICsgY291bnRHcmVhdGVyKGlkICogMiArIDEsIG1pZCArIDEsIHIsIHUsIHYsIHgpOyAKfQoKaW50IG1haW4oKSB7Cglpb3M6OnN5bmNfd2l0aF9zdGRpbyhmYWxzZSk7IAoJY2luLnRpZShudWxscHRyKTsgCQoJY2luID4+IG47IAoJZm9yIChpbnQgaSA9IDE7IGkgPD0gbjsgaSsrKSBjaW4gPj4gYVtpXTsgIAoKCXByZWNvbXB1dGUoKTsgICAKCQoJLy8gVGEgc+G6vSDEkWkgxJHhur9tIHPhu5EgxJFv4bqhbiBbbCwgcl0gdHJvbmcgdOG7q25nIHRyxrDhu51uZyBo4bujcCBzYXU6CgkvLyBUcsaw4budbmcgaOG7o3AgMTogYVtsXSDEkcOzbmcgdmFpIHRyw7IgbMOgIG1pbgoJLy8gLSBOaOG6rW4geMOpdDogYVtsXSBz4bq9IGzDoCBtaW4gY+G7p2EgxJFv4bqhbiBbbCwgcl0gduG7m2kgciB0aHXhu5ljIMSRb+G6oW4gW2wsIHJfbGVzc1tsXSAtIDFdCgkvLyA9PiBW4bubaSBt4buXaSBsLCDEkeG6v20gY8OzIGJhbyBuaGnDqnUgciB0aHXhu5ljIMSRb+G6oW4gW2wsIHJfbGVzc1tsXSAtIDFdIHNhbyBjaG8gYVtyXSBsw6AgbWF4IGPhu6dhIMSRb+G6oW4gW2wsIHJdCgkvLyA9PiBW4bubaSBt4buXaSBsLCDEkeG6v20gY8OzIGJhbyBuaGnDqnUgciB0aHXhu5ljIMSRb+G6oW4gW2wsIHJfbGVzc1tsXSAtIDFdIHNhbyBjaG8gbF9ncmVhdGVyW3JdIDwgbAoJLy8gRmFjdDogdGEgY8WpbmcgxJHDoyDEkeG6v20gbHXDtG4gbmjhu69uZyBjYXNlIGwgPSByCglpbml0VHJlZSgpOyAgCglidWlsZCgwLCAxLCAxLCBuKTsgIAoJbGwgYW5zID0gMDsgIAoJZm9yIChpbnQgbCA9IDE7IGwgPD0gbjsgbCsrKSB7CgkJYW5zICs9IGNvdW50TGVzcygxLCAxLCBuLCBsLCByX2xlc3NbbF0gLSAxLCBsKTsgCgl9IC8vIE8obmxvZ14yKG4pKQoKCS8vIFRyxrDhu51uZyBo4bujcCAyOiBhW3JdIMSRw7NuZyB2YWkgdHLDsiBsw6AgbWluCgkvLyAtIE5o4bqtbiB4w6l0OiBhW3JdIHPhur0gbMOgIG1pbiBj4bunYSDEkW/huqFuIFtsLCByXSB24bubaSBsIHRodeG7mWMgxJFv4bqhbiBbbF9sZXNzW3JdICsgMSwgcl0KCS8vID0+IFbhu5tpIG3hu5dpIHIsIMSR4bq/bSBjw7MgYmFvIG5oacOqdSBsIHRodeG7mWMgxJFv4bqhbiBbbF9sZXNzW3JdICsgMSwgcl0gc2FvIGNobyBhW2xdIGzDoCBtYXggY+G7p2EgxJFv4bqhbiBbbCwgcl0KCS8vID0+IFbhu5tpIG3hu5dpIHIsIMSR4bq/bSBjw7MgYmFvIG5oacOqdSBsIHRodeG7mWMgxJFv4bqhbiBbbF9sZXNzW3JdICsgMSwgcl0gc2FvIGNobyByX2dyZWF0ZXJbbF0gPiByCgkvLyBDaMO6IMO9OiDEkOG7gyB0csOhbmggxJHhur9tIHRyw7luZyBs4bqhaSBjYXNlIGwgPSByIHRow6wgdGEgxJHhur9tIHRyb25nIMSRb+G6oW4gW2xfbGVzc1tyXSArIDEsIHIgLSAxXQoJaW5pdFRyZWUoKTsgIAoJYnVpbGQoMSwgMSwgMSwgbik7ICAKCWZvciAoaW50IHIgPSAxOyByIDw9IG47IHIrKykgewoJCWFucyArPSBjb3VudEdyZWF0ZXIoMSwgMSwgbiwgbF9sZXNzW3JdICsgMSwgciAtIDEsIHIpOyAgCgl9IC8vIE8obmxvZ14yKG4pKQoKCWNvdXQgPDwgYW5zIDw8ICdcbic7IAp9