#include <bits/stdc++.h>
#pragma GCC optimize("-O3")
using namespace std;
void Main();
int main() {
  ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
  Main();
}
const int N = 1e6 + 10;
int v[N << 2];
bool lzy[N << 2];
void pushdown(int i) {
  if (lzy[i]) {
    v[i << 1] = 0;
    v[i << 1 | 1] = 0;
    lzy[i << 1] = true;
    lzy[i << 1 | 1] = true;
    lzy[i] = false;
  }
}
void upd(int i, int l, int r, int L, int R) {
  if (L <= l && r <= R) {
    v[i] = 0;
    lzy[i] = true;
    return;
  }
  pushdown(i);
  if (R <= ((l + r) >> 1)) {
    upd(i << 1, l, ((l + r) >> 1), L, R);
  } else if (L > ((l + r) >> 1)) {
    upd(i << 1 | 1, ((l + r) >> 1) + 1, r, L, R);
  } else {
    upd(i << 1, l, ((l + r) >> 1), L, R);
    upd(i << 1 | 1, ((l + r) >> 1) + 1, r, L, R);
  }
}
void add(int i, int l, int r, int p) {
  if (l == r && l == p) {
    v[i]++;
    return;
  }
  pushdown(i);
  if (p <= ((l + r) >> 1)) {
    add(i << 1, l, ((l + r) >> 1), p);
  } else {
    add(i << 1 | 1, ((l + r) >> 1) + 1, r, p);
  }
}
int query(int i, int l, int r, int p) {
  if (l == r && l == p) {
    return v[i];
  }
  pushdown(i);
  if (p <= ((l + r) >> 1)) {
    return query(i << 1, l, ((l + r) >> 1), p);
  } else {
    return query(i << 1 | 1, ((l + r) >> 1) + 1, r, p);
  }
}
int h[N], l[N], r[N];
void Main() {
  int n;
  cin >> n;
  map<int, int> mp;
  for (int i = 0; i < n; i++) {
    cin >> h[i];
    mp[h[i]] = 1;
  }
  int tot = 1;
  for (auto &x : mp) {
    x.second = tot++;
  }
  tot--;
  for (int i = 0; i < n; i++) {
    h[i] = mp[h[i]];
  }
  rotate(h, max_element(h, h + n), h + n);
  int cnt = 0;
  long long ans = 0;
  stack<int> st;
  st.push(0);
  for (int i = n - 1; i >= 0; i--) {
    while (!st.empty() && h[st.top()] <= h[i]) {
      st.pop();
    }
    if (!st.empty()) r[i] = st.top();
    st.push(i);
    if (h[i] == h[0]) {
      cnt++;
    } else {
      ans += query(1, 1, tot, h[i]);
    }
    add(1, 1, tot, h[i]);
    if (h[i] != 1) upd(1, 1, tot, 1, h[i] - 1);
  }
  while (!st.empty()) st.pop();
  st.push(0);
  for (int i = 1; i < n; i++) {
    while (!st.empty() && h[st.top()] <= h[i]) {
      st.pop();
    }
    if (!st.empty()) l[i] = st.top();
    st.push(i);
  }
  for (int i = 0; i < n; i++) {
    if (h[i] == h[0]) {
      continue;
    }
    if (l[i] == r[i]) {
      ans++;
    } else {
      ans += 2;
    }
  }
  ans += 1ll * cnt * (cnt - 1) / 2;
  cout << ans << "\n";
}
