#include <bits/stdc++.h>
using namespace std;
vector<int> T, L;
vector<int> x, y;
int l, size;
void Stworz(int n) {
  int p = 1;
  while (p < n) p *= 2;
  l = p;
  size = 2 * p - 1;
  for (int i = 0; i <= size; ++i) {
    T.push_back(0);
    L.push_back(0);
    x.push_back(0);
    y.push_back(0);
  }
  for (int i = l; i <= size; ++i) x[i] = 1;
  for (int i = l - 1; i >= 1; --i) x[i] = 2 * x[2 * i];
}
void Propaguj(int akt) {
  T[2 * akt] += L[akt];
  L[2 * akt] += L[akt];
  T[2 * akt + 1] += L[akt];
  L[2 * akt + 1] += L[akt];
  L[akt] = 0;
}
void Dodaj(int akt, int Le, int Pr, int le, int pr, int dod) {
  if (Le == le && Pr == pr) {
    T[akt] += dod;
    L[akt] += dod;
  } else {
    Propaguj(akt);
    int Sr = Le + (Pr - Le) / 2;
    if (le <= Sr) Dodaj(2 * akt, Le, Sr, le, min(pr, Sr), dod);
    if (pr >= Sr + 1) Dodaj(2 * akt + 1, Sr + 1, Pr, max(le, Sr + 1), pr, dod);
    T[akt] = min(T[2 * akt], T[2 * akt + 1]);
    x[akt] = 0;
    if (T[2 * akt] == T[akt]) x[akt] += x[2 * akt];
    if (T[2 * akt + 1] == T[akt]) x[akt] += x[2 * akt + 1];
    y[akt] = 0;
    if (T[2 * akt] == T[akt]) y[akt] += y[2 * akt];
    if (T[2 * akt] == T[akt] + 1) y[akt] += x[2 * akt];
    if (T[2 * akt + 1] == T[akt]) y[akt] += y[2 * akt + 1];
    if (T[2 * akt + 1] == T[akt] + 1) y[akt] += x[2 * akt + 1];
  }
}
int Ile(int akt, int Le, int Pr, int le, int pr) {
  if (Le == le && Pr == pr) {
    if (T[akt] == 1) return x[akt] + y[akt];
    if (T[akt] == 2) return x[akt];
    return 0;
  }
  Propaguj(akt);
  int wyn = 0;
  int Sr = Le + (Pr - Le) / 2;
  if (le <= Sr) wyn += Ile(2 * akt, Le, Sr, le, min(pr, Sr));
  if (pr >= Sr + 1) wyn += Ile(2 * akt + 1, Sr + 1, Pr, max(le, Sr + 1), pr);
  return wyn;
}
int main() {
  ios_base::sync_with_stdio(0);
  int n;
  cin >> n;
  if (n == 1) {
    cout << "0";
    return 0;
  }
  vector<int> p(n), gdzie(n);
  for (int i = 0; i < n; ++i) {
    cin >> p[i];
    --p[i];
    gdzie[p[i]] = i;
  }
  vector<int> start(n, 0);
  start[0] = 1;
  for (int i = 1; i < n; ++i) {
    int ilSa = 0;
    if (gdzie[i] >= 1 && p[gdzie[i] - 1] < i) ++ilSa;
    if (gdzie[i] < n - 1 && p[gdzie[i] + 1] < i) ++ilSa;
    start[i] = start[i - 1] + (1 - ilSa);
  }
  Stworz(n);
  for (int i = 0; i < n; ++i) Dodaj(1, 0, size - l, i, i, start[i]);
  long long odp = Ile(1, 0, size - l, 1, n - 1);
  for (int i = 1; i < n - 1; ++i) {
    vector<int> zmi;
    if (gdzie[i - 1] >= 1 && p[gdzie[i - 1] - 1] > i - 1)
      zmi.push_back(p[gdzie[i - 1] - 1]);
    if (gdzie[i - 1] < n - 1 && p[gdzie[i - 1] + 1] > i - 1)
      zmi.push_back(p[gdzie[i - 1] + 1]);
    if (zmi.size() == 2 && zmi[0] > zmi[1]) swap(zmi[0], zmi[1]);
    if (zmi.size() == 0) Dodaj(1, 0, size - l, i + 1, n - 1, -1);
    if (zmi.size() == 1) {
      if (zmi[0] - 1 >= i + 1) Dodaj(1, 0, size - l, i + 1, zmi[0] - 1, -1);
    }
    if (zmi.size() == 2) {
      if (zmi[0] - 1 >= i + 1) Dodaj(1, 0, size - l, i + 1, zmi[0] - 1, -1);
      Dodaj(1, 0, size - l, max(zmi[1], i + 1), n - 1, 1);
    }
    odp += Ile(1, 0, size - l, i + 1, n - 1);
  }
  cout << odp;
  return 0;
}
