#include <iostream>
#include <vector>
using namespace std;
// Generalized Suffix Automaton Node
struct State {
int len, link;
int next[10]; // Alphabet size is 10 (digits 0-9, though 1-9 are used)
};
const int MAX_STATES = 6000005; // Safe upper limit for sum of lengths
State st[MAX_STATES];
int sz = 0;
void sam_init() {
st[0].len = 0;
st[0].link = -1;
for (int i = 0; i < 10; ++i) st[0].next[i] = 0;
sz = 0;
}
// Function to extend the Generalized Suffix Automaton correctly across multiple strings
int sam_extend(int last, int c) {
if (st[last].next[c]) {
int q = st[last].next[c];
if (st[q].len == st[last].len + 1) {
return q;
} else {
int clone = ++sz;
st[clone].len = st[last].len + 1;
for (int i = 0; i < 10; ++i) st[clone].next[i] = st[q].next[i];
st[clone].link = st[q].link;
while (last != -1 && st[last].next[c] == q) {
st[last].next[c] = clone;
last = st[last].link;
}
st[q].link = clone;
return clone;
}
}
int cur = ++sz;
st[cur].len = st[last].len + 1;
for (int i = 0; i < 10; ++i) st[cur].next[i] = 0;
int p = last;
while (p != -1 && !st[p].next[c]) {
st[p].next[c] = cur;
p = st[p].link;
}
if (p == -1) {
st[cur].link = 0;
} else {
int q = st[p].next[c];
if (st[p].len + 1 == st[q].len) {
st[cur].link = q;
} else {
int clone = ++sz;
st[clone].len = st[p].len + 1;
for (int i = 0; i < 10; ++i) st[clone].next[i] = st[q].next[i];
st[clone].link = st[q].link;
while (p != -1 && st[p].next[c] == q) {
st[p].next[c] = clone;
p = st[p].link;
}
st[q].link = st[cur].link = clone;
}
}
return cur;
}
int main() {
// Optimize standard I/O operations for performance
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int N;
if (!(cin >> N)) return 0;
vector<int> A(N);
for (int i = 0; i < N; ++i) {
cin >> A[i];
}
// Run-Length Encoding of sequence A
vector<int> V, L;
for (int i = 0; i < N; ++i) {
if (V.empty() || V.back() != A[i]) {
V.push_back(A[i]);
L.push_back(1);
} else {
L.back()++;
}
}
int K = V.size();
vector<int> type(K);
for (int i = 0; i < K; ++i) {
if (L[i] < V[i]) type[i] = 0; // Deficient
else if (L[i] > V[i]) type[i] = 1; // Abundant
else type[i] = 2; // Perfect
}
sam_init();
// Condition 1: Maximal continuous sequences of Perfect blocks bounded by Abundant ones
for (int i = 0; i < K; ++i) {
if (type[i] == 2) {
int j = i;
while (j < K && type[j] == 2) j++;
int l = i, r = j - 1;
if (l > 0 && type[l - 1] >= 1) l--;
if (r < K - 1 && type[r + 1] >= 1) r++;
int last = 0;
for (int k = l; k <= r; ++k) {
last = sam_extend(last, V[k]);
}
i = j - 1; // Skip the Perfect segment we just explored
}
}
// Condition 2: Adjacent independent Abundant pairs
for (int i = 0; i < K - 1; ++i) {
if (type[i] == 1 && type[i + 1] == 1) {
int last = sam_extend(0, V[i]);
sam_extend(last, V[i + 1]);
}
}
// Condition 3: Any valid individual block
for (int i = 0; i < K; ++i) {
if (type[i] >= 1) {
sam_extend(0, V[i]);
}
}
// Tabulate distinct paths in the Suffix Automaton
long long distinct_sequences = 0;
for (int i = 1; i <= sz; ++i) {
distinct_sequences += (st[i].len - st[st[i].link].len);
}
cout << distinct_sequences << "\n";
return 0;
}