Link to this code: https://cses.fi/paste/196d9e00a28e60c3d3f92e/
#include <bits/stdc++.h>
using namespace std;

#define ll long long int
#define vt deque<ll>
#define pll pair<ll,ll>
#define pb push_back
#define BR break
#define CNT continue
#define NO cout<<"NO"<<endl
#define YES cout<<"YES"<<endl
#define NL cout<<endl;
#define ct(t) cout<<t<<endl
#define forn for(ll i=0;i<n;++i)
#define forx(i,x) for(ll i=0;i<x;++i)
#define fory(i,x,y) for(ll i=x;i<=y;++i)
#define all(v) v.begin(),v.end()
#define rall(v) v.rbegin(),v.rend()
#define inp(a,n) for(ll i=0;i<n;++i) cin>>a[i];
#define out(a,n) for(ll i=0;i<n;++i) {cout<<a[i]<<" ";} cout<<endl;
#define outmp(mp) for(auto val:mp) cout<<val.first<<" "<<val.second<<endl;
#define outst(s) for(auto val:s) {cout<<val<<" ";} NL;

const ll MOD = 1e9+7;

vector<ll> tree;
ll n;

void update(ll node, ll start, ll end, ll idx, ll val) {
    if (start == end) {
        tree[node] = (tree[node] + val) % MOD;
        return;
    }
    ll mid = (start + end) / 2;
    if (idx <= mid) update(node * 2, start, mid, idx, val);
    else update(node * 2 + 1, mid + 1, end, idx, val);
    tree[node] = (tree[node * 2] + tree[node * 2 + 1]) % MOD;
}

ll query(ll node, ll start, ll end, ll l, ll r) {
    if (r < start || end < l) return 0;
    if (l <= start && end <= r) return tree[node];
    ll mid = (start + end) / 2;
    return (query(node * 2, start, mid, l, r) +
            query(node * 2 + 1, mid + 1, end, l, r)) % MOD;
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);

    cin >> n;
    vt arr(n);
    inp(arr, n);

    vt comp = arr;
    sort(all(comp));
    comp.erase(unique(all(comp)), comp.end());

    map<ll, vector<ll>> pos;
    forn pos[arr[i]].pb(i);

    tree.assign(4 * n, 0);

    ll ans = 0;
    for (auto &p : pos) {
        vector<ll> updates;
        for (auto idx : p.second) {
            ll compressedIdx = idx + 1;
            ll cnt = query(1, 1, n, 1, compressedIdx - 1);
            ll val = (cnt + 1) % MOD;
            updates.pb(val);
        }
        for (ll k = 0; k < p.second.size(); k++) {
            ll idx = p.second[k] + 1;
            update(1, 1, n, idx, updates[k]);
            ans = (ans + updates[k]) % MOD;
        }
    }

    ct(ans);
    return 0;
}