using System; using static System.Console; using System.Linq; using System.Collections.Generic; using System.Runtime.Intrinsics.Arm; class Program { static int NN => int.Parse(ReadLine()); static int[] NList => ReadLine().Split().Select(int.Parse).ToArray(); static long[] LList(long n) => Enumerable.Repeat(0, (int)n).Select(_ => long.Parse(ReadLine())).ToArray(); public static void Main() { Solve(); } static void Solve() { var n = NN; var a = NList; var dp = Enumerable.Repeat(int.MaxValue, n).ToArray(); var nums = new List[n]; var cum = new List[n]; var sum = new long[n]; var mod = 1_000_000_007; for (var i = 0; i < n; ++i) { nums[i] = new List(); cum[i] = new List{ 0 }; } for (var i = 0; i < n; ++i) { var pos = LowerBound(0, a[i], dp); dp[pos] = a[i]; nums[pos].Add(a[i]); if (pos == 0) { cum[pos].Add(cum[pos][^1] + 1); } else { var pos2 = DecHigherBound(0, a[i] - 1, nums[pos - 1]); sum[pos] = (sum[pos] + cum[pos - 1][^1] - cum[pos - 1][pos2] + mod) % mod; cum[pos].Add((cum[pos][^1] + cum[pos - 1][^1] - cum[pos - 1][pos2] + mod) % mod); } } var ans = 0L; for (var i = 0; i < n; ++i) if (dp[i] < int.MaxValue) ans = sum[i]; WriteLine(ans); } static int LowerBound(int left, int min, IList list) { if (list[left] >= min) return left; var ng = left; var ok = list.Count; while (ok - ng > 1) { var mid = (ng + ok) / 2; if (list[mid] < min) ng = mid; else ok = mid; } return ok; } static int DecHigherBound(int left, int max, IList list) { if (list[^1] > max) return list.Count; var ok = list.Count - 1; var ng = left - 1; while (ok - ng > 1) { var mid = (ok + ng) / 2; if (list[mid] <= max) ok = mid; else ng = mid; } return ok; } }