#include #include using namespace atcoder; #define rep(i, n) for (int i = 0; i < (n); ++i) using namespace std; using ll = long long; struct S { ll sum; int mx, w; }; S op(S a, S b) { return {a.sum+b.sum, max(a.mx, b.mx), a.w+b.w}; } S e() { return {0, -1, 0}; } S mapping(int f, S x) { if (f == -1) return x; return {(ll)f*x.w, f, x.w}; } int composition(int f, int g) { if (f == -1) return g; return f; } int id() { return -1; } int main() { int n; cin >> n; vector a(n); rep(i, n) cin >> a[i]; vector m(n); vector vis(n+2); int mex = 1; rep(i, n) { vis[a[i]] = true; while (vis[mex]) ++mex; m[i] = mex; } vector nxt(n); vector last(n+2, n); for (int i = n-1; i >= 0; --i) { nxt[i] = last[a[i]]; last[a[i]] = i; } vector init(n); rep(i, n) init[i] = {m[i], m[i], 1}; lazy_segtree seg(init); ll ans = 0; rep(l, n) { ans += seg.prod(l, n).sum; int x = a[l]; int r = nxt[l]-1; if (l <= r) { int p = seg.max_right(l, [&](S s) { return s.mx <= x; }); if (p <= r) { seg.apply(p, r+1, x); } } } cout << ans << '\n'; return 0; }