from atcoder.segtree import SegTree from bisect import bisect_left from collections import defaultdict def compress(a: list) -> list: d = {v: i for i, v in enumerate(sorted(set(a)))} return [d[v] for v in a] # LIS のアルゴリズム # 各要素のランクを返す def lis_ranks(a: list) -> list: n = len(a) ranks = [0] * n # ranks[i] : A[i] が LIS の何番目か dp = [INF] * n for i in range(n): ranks[i] = bisect_left(dp, a[i]) dp[ranks[i]] = a[i] return ranks def op(a, b): return (a + b) % MOD MOD = 10 ** 9 + 7 INF = 1 << 60 N = int(input()) A = compress(list(map(int, input().split()))) ranks = lis_ranks(A) max_rank = max(ranks) d = defaultdict(list) for i in range(N): d[ranks[i]].append(i) dp = [0] * N for p in d[max_rank]: dp[p] = 1 for rank in reversed(range(max_rank)): pp = [0] * N dp, pp = pp, dp segt = SegTree(op, 0, N) inds = d[rank+1].copy() for p in reversed(d[rank]): if 1: continue while inds and p < inds[-1]: k = inds.pop() segt.set(A[k], (segt.get(A[k]) + pp[k]) % MOD) dp[p] = segt.prod(A[p]+1, N) ans = 0 for x in dp: ans += x ans %= MOD print(ans)