Problem:
Score : 400 points

Problem Statement

One day, Snuke was given a permutation of length N, a_1, a_2, ..., a_N, from his friend.

Find the following:

Constraints

1 ≦ N ≦ 200,000

(a_1, a_2, ..., a_N) is a permutation of (1, 2, ..., N).

Input

The input is given from Standard Input in the following format:

N
a_1 a_2 ... a_N

Output

Print the answer.

Note that the answer may not fit into a 32-bit integer.

Sample Input 1

3
2 1 3

Sample Output 1

9

Sample Input 2

4
1 3 2 4

Sample Output 2

19

Sample Input 3

8
5 4 8 1 2 6 7 3

Sample Output 3

85

Solution in C++14 (GCC 5.4.1) (judge verdict: Wrong Answer)

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

typedef long long ll;

vector<int> a;

bool C(int x, int k) {
    return x > a[k];
}

int main() {
    int n;
    cin >> n;
    a = vector<int>(n, 0);
    for (int i = 0; i < n; ++i) {
        cin >> a[i];
    }

    reverse(a.begin(), a.end());
    vector<ll> dp(n, 0);

    int minv = n + 1, mini = -1;
    for (int i = 0; i < n; ++i) {
        if (a[i] < minv) {
            dp[i] = (i + 1) * a[i];
            minv = a[i];
            mini = i;
        } else if (a[i] > a[i - 1]) {
            dp[i] = dp[i - 1] + a[i];
        } else {
            int ok = mini, ng = i;
            while (abs(ok - ng) > 1) {
                int mid = (ok + ng) / 2;
                if (C(a[i], mid)) ok = mid;
                else ng = mid;
            }

            dp[i] = dp[ok] + (i - ok) * a[i];
        }
    }

    ll ans = 0;
    for (int i = 0; i < n; ++i) {
        ans += dp[i];
    }

    cout << ans << endl;
}