#include <stdio.h>
#include <algorithm>
#include <assert.h>
#include <set>
#include <map>
#include <complex>
#include <iostream>
#include <time.h>
#include <math.h>
#include <stack>
#include <stdlib.h>
#include <memory.h>
#include <bitset>
#include <math.h>
#include <string>
#include <string.h>
#include <queue>
#include <vector>
using namespace std;
const int MaxN = 5e5 + 10;
const int SHIFT = 5e5 + 10;
const int INF = 1e9;
const int MOD = 1e9 + 7;
struct Node {
int sum, add;
} t[8 * SHIFT];
int n, a[MaxN];
vector < int > c[MaxN];
void compress(int a[], int n) {
vector < int > b;
for (int i = 1; i <= n; ++i) {
b.push_back(a[i]);
}
sort(b.begin(), b.end());
b.resize(unique(b.begin(), b.end()) - b.begin());
for (int i = 1; i <= n; ++i) {
a[i] = lower_bound(b.begin(), b.end(), a[i]) - b.begin();
}
}
void push(int v, int l, int r) {
if (t[v].add != 0) {
t[v].sum += (r - l + 1) * t[v].add;
if (l != r) {
t[v + v].add += t[v].add;
t[v + v + 1].add += t[v].add;
}
t[v].add = 0;
}
}
void upd(int v, int L, int R, int l, int r, int val) {
push(v, L, R);
if (l > R || r < L) {
return;
}
if (l <= L && R <= r) {
t[v].add += val;
push(v, L, R);
return;
}
int M = (L + R) / 2;
upd(v + v, L, M, l, r, val);
upd(v + v + 1, M + 1, R, l, r, val);
t[v].sum = t[v + v].sum + t[v + v + 1].sum;
}
int get(int v, int L, int R, int l, int r) {
push(v, L, R);
if (L == l && r == R) {
return t[v].sum;
}
int M = (L + R) / 2, res = 0;
push(v + v, L, M);
push(v + v + 1, M + 1, R);
if (r <= M) {
res += get(v + v, L, M, l, r);
} else if (l > M) {
res += get(v + v + 1, M + 1, R, l, r);
} else {
res += get(v + v, L, M, l, M) +
get(v + v + 1, M + 1, R, M + 1, r);
}
t[v].sum = t[v + v].sum + t[v + v + 1].sum;
return res;
}
long long solve(vector < int > &occur) {
occur.push_back(n + 1);
vector < pair < int, int > > changes;
int r = SHIFT - 0, l = SHIFT - (occur[0] - 1);
changes.push_back(make_pair(l, r));
// cout << l - SHIFT << ' ' << r - SHIFT << endl;
upd(1, 1, 2 * SHIFT, l, r, +1);
long long ans = 0LL;
for (int i = 0; i + 1 < (int)occur.size(); ++i) {
int l = 2 * (i + 1) - (occur[i + 1] - 1) + SHIFT;
int r = 2 * (i + 1) - occur[i] + SHIFT;
for (int j = r - 1, add = 1; j >= l - 1 && add != 0; --j) {
add = get(1, 1, 2 * SHIFT, 1, j);
ans += add;
}
changes.push_back(make_pair(l, r));
upd(1, 1, 2 * SHIFT, l, r, +1);
}
for (int i = 0; i < (int)changes.size(); ++i) {
int l = changes[i].first, r = changes[i].second;
upd(1, 1, 2 * SHIFT, l, r, -1);
}
return ans;
}
int main() {
// freopen("input.txt", "r", stdin);
ios::sync_with_stdio(false);
cin.tie(NULL);
cin >> n;
for (int i = 1; i <= n; ++i) {
cin >> a[i];
}
compress(a, n);
for (int i = 1; i <= n; ++i) {
c[a[i]].push_back(i);
}
long long ans = 0LL;
for (int i = 0; i < n; ++i) {
if (!c[i].empty()) {
ans += solve(c[i]);
}
}
cout << ans << '\n';
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxhbGdvcml0aG0+CiNpbmNsdWRlIDxhc3NlcnQuaD4KI2luY2x1ZGUgPHNldD4KI2luY2x1ZGUgPG1hcD4KI2luY2x1ZGUgPGNvbXBsZXg+CiNpbmNsdWRlIDxpb3N0cmVhbT4KI2luY2x1ZGUgPHRpbWUuaD4KI2luY2x1ZGUgPG1hdGguaD4KI2luY2x1ZGUgPHN0YWNrPgojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlIDxtZW1vcnkuaD4KI2luY2x1ZGUgPGJpdHNldD4KI2luY2x1ZGUgPG1hdGguaD4KI2luY2x1ZGUgPHN0cmluZz4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8cXVldWU+CiNpbmNsdWRlIDx2ZWN0b3I+CiAKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKIApjb25zdCBpbnQgTWF4TiA9IDVlNSArIDEwOwpjb25zdCBpbnQgU0hJRlQgPSA1ZTUgKyAxMDsKY29uc3QgaW50IElORiA9IDFlOTsKY29uc3QgaW50IE1PRCA9IDFlOSArIDc7CiAKc3RydWN0IE5vZGUgewogIGludCBzdW0sIGFkZDsKfSB0WzggKiBTSElGVF07CiAKaW50IG4sIGFbTWF4Tl07CnZlY3RvciA8IGludCA+IGNbTWF4Tl07CiAKdm9pZCBjb21wcmVzcyhpbnQgYVtdLCBpbnQgbikgewogIHZlY3RvciA8IGludCA+IGI7CiAgZm9yIChpbnQgaSA9IDE7IGkgPD0gbjsgKytpKSB7CiAgICBiLnB1c2hfYmFjayhhW2ldKTsKICB9CiAgc29ydChiLmJlZ2luKCksIGIuZW5kKCkpOwogIGIucmVzaXplKHVuaXF1ZShiLmJlZ2luKCksIGIuZW5kKCkpIC0gYi5iZWdpbigpKTsKICBmb3IgKGludCBpID0gMTsgaSA8PSBuOyArK2kpIHsKICAgIGFbaV0gPSBsb3dlcl9ib3VuZChiLmJlZ2luKCksIGIuZW5kKCksIGFbaV0pIC0gYi5iZWdpbigpOwogIH0KfQogCnZvaWQgcHVzaChpbnQgdiwgaW50IGwsIGludCByKSB7CiAgaWYgKHRbdl0uYWRkICE9IDApIHsKICAgIHRbdl0uc3VtICs9IChyIC0gbCArIDEpICogdFt2XS5hZGQ7CiAgICBpZiAobCAhPSByKSB7CiAgICAgIHRbdiArIHZdLmFkZCArPSB0W3ZdLmFkZDsKICAgICAgdFt2ICsgdiArIDFdLmFkZCArPSB0W3ZdLmFkZDsKICAgIH0KICAgIHRbdl0uYWRkID0gMDsKICB9Cn0KIAp2b2lkIHVwZChpbnQgdiwgaW50IEwsIGludCBSLCBpbnQgbCwgaW50IHIsIGludCB2YWwpIHsKICBwdXNoKHYsIEwsIFIpOwogIGlmIChsID4gUiB8fCByIDwgTCkgewogICAgcmV0dXJuOwogIH0KICBpZiAobCA8PSBMICYmIFIgPD0gcikgewogICAgdFt2XS5hZGQgKz0gdmFsOwogICAgcHVzaCh2LCBMLCBSKTsKICAgIHJldHVybjsKICB9CiAgaW50IE0gPSAoTCArIFIpIC8gMjsKICB1cGQodiArIHYsIEwsIE0sIGwsIHIsIHZhbCk7CiAgdXBkKHYgKyB2ICsgMSwgTSArIDEsIFIsIGwsIHIsIHZhbCk7CiAgdFt2XS5zdW0gPSB0W3YgKyB2XS5zdW0gKyB0W3YgKyB2ICsgMV0uc3VtOwp9CiAKaW50IGdldChpbnQgdiwgaW50IEwsIGludCBSLCBpbnQgbCwgaW50IHIpIHsKICBwdXNoKHYsIEwsIFIpOwogIGlmIChMID09IGwgJiYgciA9PSBSKSB7CiAgICByZXR1cm4gdFt2XS5zdW07CiAgfQogIGludCBNID0gKEwgKyBSKSAvIDIsIHJlcyA9IDA7CiAgcHVzaCh2ICsgdiwgTCwgTSk7CiAgcHVzaCh2ICsgdiArIDEsIE0gKyAxLCBSKTsKICBpZiAociA8PSBNKSB7CiAgICByZXMgKz0gZ2V0KHYgKyB2LCBMLCBNLCBsLCByKTsKICB9IGVsc2UgaWYgKGwgPiBNKSB7CiAgICByZXMgKz0gZ2V0KHYgKyB2ICsgMSwgTSArIDEsIFIsIGwsIHIpOwogIH0gZWxzZSB7CiAgICByZXMgKz0gZ2V0KHYgKyB2LCBMLCBNLCBsLCBNKSArCiAgICAgIGdldCh2ICsgdiArIDEsIE0gKyAxLCBSLCBNICsgMSwgcik7CiAgfQogIHRbdl0uc3VtID0gdFt2ICsgdl0uc3VtICsgdFt2ICsgdiArIDFdLnN1bTsKICByZXR1cm4gcmVzOwp9CiAKbG9uZyBsb25nIHNvbHZlKHZlY3RvciA8IGludCA+ICZvY2N1cikgewogIG9jY3VyLnB1c2hfYmFjayhuICsgMSk7CiAgdmVjdG9yIDwgcGFpciA8IGludCwgaW50ID4gPiBjaGFuZ2VzOwogIGludCByID0gU0hJRlQgLSAwLCBsID0gU0hJRlQgLSAob2NjdXJbMF0gLSAxKTsKICBjaGFuZ2VzLnB1c2hfYmFjayhtYWtlX3BhaXIobCwgcikpOwovLyAgY291dCA8PCBsIC0gU0hJRlQgPDwgJyAnIDw8IHIgLSBTSElGVCA8PCBlbmRsOwogIHVwZCgxLCAxLCAyICogU0hJRlQsIGwsIHIsICsxKTsKICBsb25nIGxvbmcgYW5zID0gMExMOwogIGZvciAoaW50IGkgPSAwOyBpICsgMSA8IChpbnQpb2NjdXIuc2l6ZSgpOyArK2kpIHsKICAgIGludCBsID0gMiAqIChpICsgMSkgLSAob2NjdXJbaSArIDFdIC0gMSkgKyBTSElGVDsKICAgIGludCByID0gMiAqIChpICsgMSkgLSBvY2N1cltpXSArIFNISUZUOwogICAgZm9yIChpbnQgaiA9IHIgLSAxLCBhZGQgPSAxOyBqID49IGwgLSAxICYmIGFkZCAhPSAwOyAtLWopIHsKICAgICAgYWRkID0gZ2V0KDEsIDEsIDIgKiBTSElGVCwgMSwgaik7CiAgICAgIGFucyArPSBhZGQ7CiAgICB9CiAgICBjaGFuZ2VzLnB1c2hfYmFjayhtYWtlX3BhaXIobCwgcikpOwogICAgdXBkKDEsIDEsIDIgKiBTSElGVCwgbCwgciwgKzEpOwogIH0KICBmb3IgKGludCBpID0gMDsgaSA8IChpbnQpY2hhbmdlcy5zaXplKCk7ICsraSkgewogICAgaW50IGwgPSBjaGFuZ2VzW2ldLmZpcnN0LCByID0gY2hhbmdlc1tpXS5zZWNvbmQ7CiAgICB1cGQoMSwgMSwgMiAqIFNISUZULCBsLCByLCAtMSk7CiAgfQogIHJldHVybiBhbnM7Cn0KIAppbnQgbWFpbigpIHsKLy8gIGZyZW9wZW4oImlucHV0LnR4dCIsICJyIiwgc3RkaW4pOwogIGlvczo6c3luY193aXRoX3N0ZGlvKGZhbHNlKTsKICBjaW4udGllKE5VTEwpOwogIGNpbiA+PiBuOwogIGZvciAoaW50IGkgPSAxOyBpIDw9IG47ICsraSkgewogICAgY2luID4+IGFbaV07CiAgfQogIGNvbXByZXNzKGEsIG4pOwogIGZvciAoaW50IGkgPSAxOyBpIDw9IG47ICsraSkgewogICAgY1thW2ldXS5wdXNoX2JhY2soaSk7CiAgfQogIGxvbmcgbG9uZyBhbnMgPSAwTEw7CiAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgIGlmICghY1tpXS5lbXB0eSgpKSB7CiAgICAgIGFucyArPSBzb2x2ZShjW2ldKTsKICAgIH0KICB9CiAgY291dCA8PCBhbnMgPDwgJ1xuJzsKICByZXR1cm4gMDsKfQog