#include using namespace std; #define int long long const int N=5e5+5,p=1e9+7; int a[N],n; pair w[N<<2]; pair mrg(pair x,pair y){ if(x.first==y.first) return make_pair(x.first,(x.second+y.second)%p); else if(x.first>y.first) return x; else return y; } void psh(int u){ w[u]=mrg(w[u<<1],w[u<<1|1]); } void upd(int u,int l,int r,int q,pair x){ if(l==r) w[u]=x; else{ int mid=l+r>>1; if(q<=mid) upd(u<<1,l,mid,q,x); else upd(u<<1|1,mid+1,r,q,x); psh(u); } } pair qry(int u,int l1,int r1,int l2,int r2){ if(l2>r2) return make_pair(0,1); if(l2<=l1&&r1<=r2) return w[u]; else{ int mid=l1+r1>>1; if(l2>mid) return qry(u<<1|1,mid+1,r1,l2,r2); if(r2<=mid) return qry(u<<1,l1,mid,l2,r2); return mrg(qry(u<<1,l1,mid,l2,r2),qry(u<<1|1,mid+1,r1,l2,r2)); } } signed main(){ scanf("%lld",&n); for(int i=1;i<=n;i++) scanf("%lld",&a[i]); for(int i=1;i<=n;i++){ pair res=qry(1,1,n,1,a[i]-1);res.first++,res.second=max(res.second,1LL); upd(1,1,n,a[i],res); } printf("%lld\n",qry(1,1,n,1,n).second); return 0; }