// Cách 1
// Pass 2/11 Time Limit Exceed
// ý tưởng bằng cách duyệt i [1, n-3] và j [2, n-2] tìm max planet trong đoạn [i, j] và lưu vào coupleMaxMP
// sau đó lại duyệt từ i [0, n-2] và j [1, n-1]
// và so sánh giá trị lớn nhất trong đoạn [i+1, j-1] ( tức coupleMaxMP[i+1, j-1])
// với min planet [i] và [j]
// nếu các planet bên trong đoạn [i, j] < giá trị của planet tại i, j thì tăng count lên
// #include <bits/stdc++.h>
// #include <iostream>
// using namespace std;
// int N; // 행성의 수 Number of planets
// int W[100000 + 10]; // 행성 질량 Mass of planets
// map<pair<int, int>, int> coupleMaxMP;
// // int _count = 0;
// void InputData(void) {
// cin >> N;
// // cout<<"N = " << N << endl;
// for (int i = 0; i < N; i++) {
// cin >> W[i];
// }
// }
// int main(void) {
// int ans = 0;
// InputData(); // 입력 Input
// // 코드를 작성하세요 Write from here
// // for (int i = 0; i <= N-2; i++) {
// // coupleMaxMP[{i,i+1}] = max (W[i], W[i+1]);
// // }
// for (int i = 1; i <= N-3; i++) {
// for (int j = i+1; j <= N-2; j++) {
// if (j == i+1) {
// coupleMaxMP[{i, j}] = max (W[i], W[j]);
// }
// coupleMaxMP[{i, j}] = max (coupleMaxMP[{i, j-1}], W[j]);
// }
// }
// // cout<<"print coupleMaxMP" <<" begin" << endl;
// // for (auto& xx: coupleMaxMP) {
// // cout<<"[" << xx.first.first <<" " << xx.first.second <<"]: " << xx.second << endl;
// // }
// // cout<<"print coupleMaxMP" <<" end" << endl;
// ans = 0;
// for (int i = 0; i <= N-2; i++) {
// for (int j = i+1; j <= N-1; j++) {
// if (j == i+1) {
// ans++;
// } else {
// if (j == i+2) {
// if (W[i+1] < W[i] && W[i+1] < W[j]) {
// //found a config
// ans++;
// } else {
// //nothing
// }
// } else { //j >= i+3
// if (coupleMaxMP[{i+1, j-1}] < W[i] && coupleMaxMP[{i+1, j-1}] < W[j]) {
// ans++;
// } else {
// //nothing
// }
// }
// }
// }
// }
// cout << ans << endl; // 출력 Output
// return 0;
// }
// =========================================================================
// // cách 2, tham khảo
// // Pass 3/11 test case, TLE
// // cách làm, cho đoạn i, j, tìm kiểm tra xem [i+1, j-1] có thỏa mãn max value([i+1, j-1]) < min (value(i, j))
// #include <bits/stdc++.h>
// #include <iostream>
// using namespace std;
// int N; // Number of planets
// int W[100000 + 10]; // Mass of planets
// int ans = 0;
// void InputData(void) {
// cin >> N;
// for (int i = 0; i < N; i++) {
// cin >> W[i];
// }
// }
// bool canTravel(int i, int j) {
// if (j == i+1) {
// return true;
// } else {
// int tmpMax = 0;
// for (int k = i+1; k <= j-1; k++) {
// tmpMax = max ( tmpMax, W[k]);
// }
// if (tmpMax < min(W[i], W[j])) return true;
// else return false;
// }
// }
// int main(void) {
// // int ans = -1;
// InputData(); // Input
// // Write code from here
// for (int i = 0; i <= N-2; i++) {
// for (int j = i+1; j <= N-1; j++) {
// if (canTravel(i, j) == true) ans++;
// }
// }
// cout << ans << endl; // Output
// return 0;
// }
// =========================================================================
// cách 3
// Pass 5/11 Time Limit Exceed
// cách làm, su dung two pointers, i chay tu 0 den N-2, j chay tu i+1 den N-1
// tai moi diem j dang xet, tìm max của đoạn [i+1, j-1] ,
// nếu như nhỏ hơn min đoạn (i, j) thì tăng biến đếm lên, và tiếp tục
// nếu ko thỏa mãn, không tăng biến đếm, thì vẫn tăng j lên để tìm đoạn phù hợp
#include <bits/stdc++.h>
using namespace std;
int N; // Number of planets
int W[100000 + 10]; // Mass of planets
int ans = 0;
void InputData(void) {
cin >> N;
for (int i = 0; i < N; i++) {
cin >> W[i];
}
}
int main(void) {
InputData(); // Input
for (int i = 0; i <= N - 2; i++) {
int tmpMax = W[i + 1]; // Bắt đầu từ phần tử liền kề
for (int j = i + 1; j <= N - 1; j++) {
if (j == i + 1) {
// Cặp lân cận luôn hợp lệ
ans++;
} else {
// Cập nhật giá trị lớn nhất của đoạn [i+1, j-1]
tmpMax = max(tmpMax, W[j - 1]);
// Kiểm tra điều kiện giữa hai hành tinh
if (tmpMax < min(W[i], W[j])) {
ans++;
} else {
// Nếu không hợp lệ, vẫn tiếp tục kiểm tra, không break,
// bởi vì vẫn có thể tìm thấy k thuộc [i, j] thỏa mãn
}
}
}
}
cout << ans << endl; // Output
return 0;
}
// =========================================================================
// cach 4 AI
// dung two pointers, Pass 5/11, Time limit
// #include <iostream>
// #include <vector>
// #include <algorithm>
// using namespace std;
// int main() {
// int n;
// cin >> n;
// vector<int> w(n);
// for (int i = 0; i < n; ++i) {
// cin >> w[i];
// }
// int count = 0;
// for (int i = 0; i < n; ++i) {
// for (int j = i + 1; j < n; ++j) {
// bool possible = true;
// int left = i + 1;
// int right = j - 1;
// if (left <= right) {
// for (int k = left; k <= right; ++k) {
// if (w[k] >= w[i] || w[k] >= w[j]) {
// possible = false;
// break;
// }
// }
// }
// if (possible) {
// count++;
// }
// }
// }
// cout << count << endl;
// return 0;
// }
// =========================================================================
// cach 5 AI brute force
// Pass 5/11, Time Limit
// #include <iostream>
// #include <vector>
// using namespace std;
// int countTravelablePairs(const vector<int>& masses) {
// int n = masses.size();
// int count = 0;
// for (int i = 0; i < n; ++i) {
// for (int j = i + 1; j < n; ++j) {
// bool canTravel = true;
// for (int k = i + 1; k < j; ++k) {
// if (masses[k] >= masses[i] || masses[k] >= masses[j]) {
// canTravel = false;
// break;
// }
// }
// if (canTravel) {
// count++;
// }
// }
// }
// return count;
// }
// int main() {
// int n;
// cin >> n;
// vector<int> masses(n);
// for (int i = 0; i < n; ++i) {
// cin >> masses[i];
// }
// int result = countTravelablePairs(masses);
// cout << result << endl;
// return 0;
// }
// =========================================================================
// cách 6 theo khảo ý anh Mạnh
// tại mỗi planet k,
// tìm planet i ở phía trên phải mà có giá trị max
// tìm planet j ở phía trên phải mà có giá trị max
// chưa triển khai được
// =========================================================================
// =========================================================================