#include using namespace std; typedef pair PII; const int kMod = 1000000007; long F(long t) { if (t < 1) return 0; return t*(t+1)*(t+2)/6; } long H(long n, long k) { return k*n*(n+k)/2; } long H1(long n, long k, long m) { return (k*n*(n+k) + k*m*(m-1))/2 - F(m-1-n) + F(m-1-n-k); } long H2(long n, long k, long m) { return (k*n*(n+k) + n*m*(m+1))/2 - F(m+1-k) + F(m+1-n-k); } int solve(const vector& A) { const int N = A.size(); int max_value = 0; for(int i=0; i=0; --i) { if (max_value == A[i]) { last_max = i; break; } } __int128_t nonmax_count = 0; long res = 0; vector ks(N, 0L), ns(N, 0L), ms(N, 0L); vector leb, reb; leb.reserve(N); reb.reserve(N); // left end leb.push_back(PII(max_value, last_max)); for(int i=last_max+1; i= last_max) { ks[i] = i+1; ms[i] = N-1 - leb.back().second; } else { ks[i] = i - leb.back().second; } if (leb.back().first == cur_A) { leb.back().second = i; } else { leb.push_back(PII(cur_A, i)); } } reb.push_back(PII(max_value, first_max)); for(int i=first_max-1; i>=0; --i) { int cur_A = A[i]; while(reb.back().first <= cur_A) { reb.pop_back(); } ns[i] = reb.back().second - i; reb.push_back(PII(cur_A, i)); } for(int i=0; ifirst_max; --i) { int cur_A = A[i]; while(reb.size() && (reb.back().first <= cur_A)) { reb.pop_back(); } if (cur_A != max_value) { ns[i] = reb.back().second - i; } reb.push_back(PII(cur_A, i)); } for(int i=first_max+1; i=0; --i) { int cur_A = A[i]; while(reb.back().first <= cur_A) reb.pop_back(); reb.push_back(PII(cur_A, i)); } for(int i=N-1; i>last_max; --i) { int cur_A = A[i]; while(reb.back().first <= cur_A) {reb.pop_back(); } if (reb.back().second <= first_max) { ns[i] = N-i; ms[i] = reb.back().second; } else { ns[i] = reb.back().second - i; } reb.push_back(PII(cur_A, i)); } for(int i=last_max+1; i> N; vector A(N); for(int i=0; i> A[i]; } cout << solve(A) << endl; return 0; }