#define _USE_MATH_DEFINES #include using namespace std; using ul = unsigned long long; using ll = long long; using ld = long double; using pll = pair; #define in(v,c) ((c).find(v) != (c).end()) #define F(i,n) for(ll i = 0; i < (n); i++) #define Fun(i,n) for(ul i = 0; i < (n); i++) #ifdef GPD templatevoid lerr(F&&f){cerr<(f)<void lerr(F&&f,R&&...r){cerr<(f)<<' ';lerr(forward(r)...);} #else #define lerr(...) #endif struct Tree { typedef int T; static constexpr T unit = INT_MIN; T f(T a, T b){return max(a,b);} vector s; int n; Tree(int n = 0, T def = unit):s(2*n,def),n(n){} void update(int pos, T val) { for(s[pos += n] = val; pos /= 2;) s[pos] = f(s[pos*2],s[pos*2+1]); } T query(int b, int e) { T ra = unit, rb = unit; for(b += n, e += n; b < e; b/=2, e /= 2) { if(b%2) ra = f(ra, s[b++]); if(e%2) rb = f(s[--e],rb); } return f(ra, rb); } }; int main(int argc, char const *argv[]) { cin.tie(0)->sync_with_stdio(0); cin.exceptions(cin.failbit); cout << setprecision(9) << fixed; lerr("ready"); ll n; cin >> n; Tree t(n); vector nums(n); F(i, n) { cin >> nums[i]; t.update(i, nums[i]); } ll ret = 0; unordered_map m; F(i, n) { ll v = nums[i]; if(in(v, m)) { ll max = t.query(m[v], i); if(max == v) { lerr("ok", m[v], i, v); ret+=i-m[v]-1; } } m[nums[i]] = i; } cout << ret << endl; return 0; }