import bisect

MOD = 10**9 + 7

class SegmentTree:
    def __init__(self, data_size):
        self.n = data_size
        self.size = 1
        while self.size < self.n:
            self.size <<= 1
        self.max_len = [0] * (2 * self.size)
        self.sum_cnt = [0] * (2 * self.size)
    
    def update(self, pos, new_len, new_cnt):
        pos += self.size
        if self.max_len[pos] < new_len:
            self.max_len[pos] = new_len
            self.sum_cnt[pos] = new_cnt % MOD
        elif self.max_len[pos] == new_len:
            self.sum_cnt[pos] = (self.sum_cnt[pos] + new_cnt) % MOD
        else:
            return
        pos >>= 1
        while pos >= 1:
            left = pos << 1
            right = left + 1
            left_max = self.max_len[left]
            left_cnt = self.sum_cnt[left]
            right_max = self.max_len[right]
            right_cnt = self.sum_cnt[right]
            if left_max > right_max:
                combined_max = left_max
                combined_cnt = left_cnt
            elif right_max > left_max:
                combined_max = right_max
                combined_cnt = right_cnt
            else:
                combined_max = left_max
                combined_cnt = (left_cnt + right_cnt) % MOD
            if self.max_len[pos] == combined_max and self.sum_cnt[pos] == combined_cnt:
                break
            self.max_len[pos] = combined_max
            self.sum_cnt[pos] = combined_cnt
            pos >>= 1
    
    def query(self, l, r):
        res_max = 0
        res_cnt = 0
        l += self.size
        r += self.size
        while l <= r:
            if l % 2 == 1:
                current_max = self.max_len[l]
                current_cnt = self.sum_cnt[l]
                if current_max > res_max:
                    res_max = current_max
                    res_cnt = current_cnt
                elif current_max == res_max:
                    res_cnt = (res_cnt + current_cnt) % MOD
                l += 1
            if r % 2 == 0:
                current_max = self.max_len[r]
                current_cnt = self.sum_cnt[r]
                if current_max > res_max:
                    res_max = current_max
                    res_cnt = current_cnt
                elif current_max == res_max:
                    res_cnt = (res_cnt + current_cnt) % MOD
                r -= 1
            l >>= 1
            r >>= 1
        return res_max, res_cnt

def main():
    import sys
    input = sys.stdin.read().split()
    N = int(input[0])
    A = list(map(int, input[1:N+1]))
    sorted_unique = sorted(set(A))
    m = len(sorted_unique)
    compressed = []
    for x in A:
        k = bisect.bisect_left(sorted_unique, x)
        compressed.append(k)
    if m == 0:
        print(0)
        return
    tree = SegmentTree(m)
    global_max = 0
    global_sum = 0
    for k in compressed:
        if k == 0:
            max_prev, sum_prev = 0, 0
        else:
            max_prev, sum_prev = tree.query(0, k-1)
        if max_prev == 0 and sum_prev == 0:
            len_i = 1
            cnt_i = 1
        else:
            len_i = max_prev + 1
            cnt_i = sum_prev
        tree.update(k, len_i, cnt_i)
        if len_i > global_max:
            global_max = len_i
            global_sum = cnt_i
        elif len_i == global_max:
            global_sum = (global_sum + cnt_i) % MOD
    print(global_sum % MOD)

if __name__ == "__main__":
    main()