#include <bits/stdc++.h>
using namespace std;
const int inf = 1e9 + 333;
const long long linf = 1e18 + inf;
const int N = 3e5 + 5;
int n;
int a[N], w[N];
class node {
 public:
  int min1, min2, cnt1, cnt2, add;
  node() { min1 = min2 = cnt1 = cnt2 = add = 0; }
  int get() { return cnt1 + (min2 == 2) * cnt2; }
};
node t[N << 2];
node merge(node x, node y) {
  node t;
  if (x.min1 == y.min1) {
    t.min1 = x.min1;
    t.min2 = min(x.min2, y.min2);
  } else {
    t.min1 = min(x.min1, y.min1);
    t.min2 = min(max(x.min1, y.min1), min(x.min2, y.min2));
  }
  t.cnt1 = (t.min1 == x.min1) * x.cnt1 + (t.min1 == x.min2) * x.cnt2 +
           (t.min1 == y.min1) * y.cnt1 + (t.min1 == y.min2) * y.cnt2;
  t.cnt2 = (t.min2 == x.min1) * x.cnt1 + (t.min2 == x.min2) * x.cnt2 +
           (t.min2 == y.min1) * y.cnt1 + (t.min2 == y.min2) * y.cnt2;
  return t;
}
void push(int x) {
  if (t[x].add) {
    int k = t[x].add;
    t[x + x].add += k;
    t[x + x].min1 += k;
    t[x + x].min2 += k;
    t[x + x + 1].add += k;
    t[x + x + 1].min1 += k;
    t[x + x + 1].min2 += k;
    t[x].add = 0;
  }
}
void init(int x, int l, int r) {
  if (l == r) {
    t[x].min1 = 0;
    t[x].min2 = inf;
    t[x].cnt1 = 1;
    t[x].cnt2 = 0;
    return;
  }
  int m = l + r >> 1;
  init(x + x, l, m);
  init(x + x + 1, m + 1, r);
  t[x] = merge(t[x + x], t[x + x + 1]);
}
void update(int x, int l, int r, int x1, int x2, int k) {
  if (x2 < l or r < x1) return;
  if (x1 <= l and r <= x2) {
    t[x].add += k;
    t[x].min1 += k;
    t[x].min2 += k;
    return;
  }
  push(x);
  int m = l + r >> 1;
  update(x + x, l, m, x1, x2, k);
  update(x + x + 1, m + 1, r, x1, x2, k);
  t[x] = merge(t[x + x], t[x + x + 1]);
}
node query(int x, int l, int r, int x1, int x2) {
  if (x1 <= l and r <= x2) return t[x];
  push(x);
  int m = l + r >> 1;
  if (m >= x1) {
    if (m + 1 <= x2)
      return merge(query(x + x, l, m, x1, x2),
                   query(x + x + 1, m + 1, r, x1, x2));
    return query(x + x, l, m, x1, x2);
  }
  return query(x + x + 1, m + 1, r, x1, x2);
}
int main() {
  scanf("%d", &n);
  for (int i = 1; i <= n; i++) {
    scanf("%d", a + i);
    w[a[i]] = i;
  }
  for (int i = 1; i <= n; i++) {
    a[i] = w[i];
  }
  for (int i = 1; i <= n; i++) {
    w[a[i]] = i;
  }
  long long ans = 0;
  init(1, 1, n);
  for (int i = n; i >= 1; i--) {
    int l = n, r = n + 1;
    if (w[a[i] - 1] > i or w[a[i] + 1] > i)
      l = min(w[a[i] - 1] > i ? w[a[i] - 1] : inf,
              w[a[i] + 1] > i ? w[a[i] + 1] : inf) -
          1;
    if (w[a[i] - 1] > i and w[a[i] + 1] > i) r = max(w[a[i] - 1], w[a[i] + 1]);
    update(1, 1, n, i, l, +1);
    update(1, 1, n, r, n, -1);
    ans += query(1, 1, n, i, n).get();
  }
  printf("%lld\n", ans - n);
  return 0;
}
