#include #define int long long using std::max; constexpr int N = 1e6; int n, a[N + 1]; int mx[N << 2], se[N << 2], cn[N << 2], tag[N << 2]; long long sum[N << 2]; void pushup(int u) { // 向上更新标记 const int ls = u << 1, rs = u << 1 | 1; sum[u] = sum[ls] + sum[rs]; if (mx[ls] == mx[rs]) { mx[u] = mx[rs]; se[u] = max(se[ls], se[rs]); cn[u] = cn[ls] + cn[rs]; } else if (mx[ls] > mx[rs]) { mx[u] = mx[ls]; se[u] = max(se[ls], mx[rs]); cn[u] = cn[ls]; } else { mx[u] = mx[rs]; se[u] = max(mx[ls], se[rs]); cn[u] = cn[rs]; } } void pushtag(int u, int tg) { // 单纯地打标记,不暴搜 if (mx[u] <= tg) return; sum[u] += (1ll * tg - mx[u]) * cn[u]; mx[u] = tag[u] = tg; } void pushdown(int u) { // 下传标记 if (tag[u] == -1) return; pushtag(u << 1, tag[u]), pushtag(u << 1 | 1, tag[u]); tag[u] = -1; } void build(int u = 1, int l = 1, int r = n) { // 建树 tag[u] = -1; if (l == r) { sum[u] = mx[u] = n + 1, se[u] = -1, cn[u] = 1; return; } int mid = (l + r) >> 1; build(u << 1, l, mid), build(u << 1 | 1, mid + 1, r); pushup(u); } void modify_min(int L, int R, int v, int u = 1, int l = 1, int r = n) { if (L > R || mx[u] <= v) return; if (L <= l && r <= R && se[u] < v) return pushtag(u, v); int mid = (l + r) >> 1; pushdown(u); if (L <= mid) modify_min(L, R, v, u << 1, l, mid); if (mid < R) modify_min(L, R, v, u << 1 | 1, mid + 1, r); pushup(u); } long long query_sum(int L, int R, int u = 1, int l = 1, int r = n) { if (L <= l && r <= R) return sum[u]; int mid = (l + r) >> 1; long long res = 0; pushdown(u); if (L <= mid) res += query_sum(L, R, u << 1, l, mid); if (mid < R) res += query_sum(L, R, u << 1 | 1, mid + 1, r); return res; } void solve() { std::cin >> n; std::vector> pos(n + 2); for (int i = 1; i <= n; i++) { std::cin >> a[i]; pos[a[i]].push_back(i); } build(); int ans = 0; for (int x = 0; x <= n + 1; x++) { int pre = 0; for (int i : pos[x]) { modify_min(std::max(pre, 1ll), i - 1, pre); pre = i; } modify_min(pre, n, pre); ans += sum[1]; } std::cout << ans << '\n'; } int32_t main() { std::cin.tie(nullptr)->sync_with_stdio(false); int t = 1; // std::cin >> t; while (t--) { solve(); } return 0; }