#!/usr/bin/env python3

class UnionFind:

    __slots__ = ['id','sz']



    def __init__(self, n):

        self.id = [-1] * n



    def root(self, x):

        if self.id[x] < 0:

            return x

        else:

            self.id[x] = self.root(self.id[x])

            return self.id[x]



    def find(self, x, y):

        return uf.root(x) == uf.root(y)



    def union(self, x, y):

        s1, s2 = self.root(x), self.root(y)

        if s1 != s2:

            if self.id[s1] <= self.id[s2]:

                self.id[s1] += self.id[s2]

                self.id[s2] = s1

            else:

                self.id[s2] += self.id[s1]

                self.id[s1] = s2

            return True

        return False



n = int(eval(input()))

a = list(map(int,input().split()))

uf = UnionFind(n)

ans=0

data=[0]*n

b=[0]*(n+1)

for i in range(n):

    b[a[i]]=i

for i in range(n,0,-1):

    r,l=0,0

    data[b[i]]=i

    if b[i]+1 <= n-1:

        if data[b[i]+1]>0:

            uf.union(b[i],b[i]+1)

    r=-uf.id[uf.root(b[i])]



    if b[i]-1>=0 and data[b[i]-1]>0:

        uf.union(b[i],b[i]-1)

    l=1-uf.id[uf.root(b[i])]-r

    ans+=(r*l)*i

print(ans)





#!/usr/bin/env python3

ans=0

n=int(eval(input()))

A=list(map(int,input().split()))

B=[0]*(n+1)

for i in range(n):

    B[A[i]]=i+1

LL=[int(i) for i in range(n+2)]

RR=[int(i) for i in range(n+2)]

for i in range(n,0,-1):

    l=LL[B[i]]

    r=RR[B[i]]

    ans+=(B[i]-l+1)*(r-B[i]+1)*i

    LL[r+1]=l

    RR[l-1]=r

print(ans)

#!/usr/bin/env python3
class UnionFind:
    __slots__ = ["id", "sz"]

    def __init__(self, n):
        self.id = [-1] * n

    def root(self, x):
        if self.id[x] < 0:
            return x
        else:
            self.id[x] = self.root(self.id[x])
            return self.id[x]

    def find(self, x, y):
        return uf.root(x) == uf.root(y)

    def union(self, x, y):
        s1, s2 = self.root(x), self.root(y)
        if s1 != s2:
            if self.id[s1] <= self.id[s2]:
                self.id[s1] += self.id[s2]
                self.id[s2] = s1
            else:
                self.id[s2] += self.id[s1]
                self.id[s1] = s2
            return True
        return False


n = int(eval(input()))
a = list(map(int, input().split()))
uf = UnionFind(n)
ans = 0
data = [0] * n
b = [0] * (n + 1)
for i in range(n):
    b[a[i]] = i
for i in range(n, 0, -1):
    r, l = 0, 0
    data[b[i]] = i
    if b[i] + 1 <= n - 1:
        if data[b[i] + 1] > 0:
            uf.union(b[i], b[i] + 1)
    r = -uf.id[uf.root(b[i])]
    if b[i] - 1 >= 0 and data[b[i] - 1] > 0:
        uf.union(b[i], b[i] - 1)
    l = 1 - uf.id[uf.root(b[i])] - r
    ans += (r * l) * i
print(ans)

#!/usr/bin/env python3
ans = 0
n = int(eval(input()))
A = list(map(int, input().split()))
B = [0] * (n + 1)
for i in range(n):
    B[A[i]] = i + 1
LL = [int(i) for i in range(n + 2)]
RR = [int(i) for i in range(n + 2)]
for i in range(n, 0, -1):
    l = LL[B[i]]
    r = RR[B[i]]
    ans += (B[i] - l + 1) * (r - B[i] + 1) * i
    LL[r + 1] = l
    RR[l - 1] = r
print(ans)

-class UnionFind: -    __slots__ = ["id", "sz"] - -    def __init__(self, n): -        self.id = [-1] * n - -    def root(self, x): -        if self.id[x] < 0: -            return x -        else: -            self.id[x] = self.root(self.id[x]) -            return self.id[x] - -    def find(self, x, y): -        return uf.root(x) == uf.root(y) - -    def union(self, x, y): -        s1, s2 = self.root(x), self.root(y) -        if s1 != s2: -            if self.id[s1] <= self.id[s2]: -                self.id[s1] += self.id[s2] -                self.id[s2] = s1 -            else: -                self.id[s2] += self.id[s1] -                self.id[s1] = s2 -            return True -        return False - - +ans = 0 -a = list(map(int, input().split())) -uf = UnionFind(n) -ans = 0 -data = [0] * n -b = [0] * (n + 1) +A = list(map(int, input().split())) +B = [0] * (n + 1) -    b[a[i]] = i +    B[A[i]] = i + 1 +LL = [int(i) for i in range(n + 2)] +RR = [int(i) for i in range(n + 2)] -    r, l = 0, 0 -    data[b[i]] = i -    if b[i] + 1 <= n - 1: -        if data[b[i] + 1] > 0: -            uf.union(b[i], b[i] + 1) -    r = -uf.id[uf.root(b[i])] -    if b[i] - 1 >= 0 and data[b[i] - 1] > 0: -        uf.union(b[i], b[i] - 1) -    l = 1 - uf.id[uf.root(b[i])] - r -    ans += (r * l) * i +    l = LL[B[i]] +    r = RR[B[i]] +    ans += (B[i] - l + 1) * (r - B[i] + 1) * i +    LL[r + 1] = l +    RR[l - 1] = r