#include <bits/stdc++.h>
#define fi first
#define se second
#define all(v) v.begin() , v.end()
#define sz(v) int(v.size())
#define unq(v) sort(all(v)); v.resize(unique(all(v)) - v.begin());
using namespace std;

typedef long long ll;
typedef pair<int , int> ii;
typedef pair<long long , int> lli;

const int maxN = 4007;
const int mod = int(1e9)+7;

int add(int x , int y){
    x += y;
    if (x >= mod) x -= mod;
    return x;
}

void self_add(int &x , int y){
    x = add(x , y);
}

int sub(int x , int y){
    x -= y;
    if (x < 0) x += mod;
    return x;
}

void self_sub(int &x , int y){
    x = sub(x , y);
}

int mul(int x , int y){
    return (1ll * x * y) % mod;
}

int n , m , a[maxN] , dp[maxN][maxN];
bool mark[maxN][maxN];

namespace sub1{
    bool check(){
        return (n <= 100 && m <= 400);
    }

    void solve(){
        for (int i = 1 ; i <= n ; i++){
            int cur = INT_MIN;
            for (int j = i ; j <= n ; j++){
                cur = max(cur , a[j]);
                if (i > 1 && j < n){
                    mark[i - 1][j + 1] = (cur > max(a[i - 1] , a[j + 1]));
                }
            }
        }
        for (int i = 1 ; i <= n ; i++){
            dp[i][a[i]] = 1;
            for (int t = a[i] ; t <= m ; t++){
                for (int j = 1 ; j < i ; j++){
                    if (mark[j][i] == 1) self_add(dp[i][t] , dp[j][t - a[i]]);
                }
            }
        }
        int ans = 1;
        for (int i = 1 ; i <= n ; i++){
            for (int t = 1 ; t <= m ; t++){
                self_add(ans , dp[i][t]);
            }
        }
        cout << ans << "\n";
    }
}

namespace sub2{
    int pre[maxN][maxN] , sum_pre[maxN];
    bool del[maxN];

    void solve(){
        deque<int> dq;
        for (int i = 1 ; i <= n ; i++){
            while (dq.empty() == 0 && a[dq.back()] <= a[i]){
                int j = dq.back();
                for (int t = 1 ; t <= m ; t++){
                    self_sub(sum_pre[t] , pre[j][t]);
                    self_add(pre[i][t] , pre[j][t]);
                }
                if (a[j] < a[i]){
                    for (int t = 1 ; t <= m ; t++){
                        self_add(pre[i][t] , dp[j][t]);
                    }
                }
                else{
                    del[j] = 1;
                    for (int t = 1 ; t <= m ; t++){
                        self_add(dp[i][t] , dp[j][t]);
                    }
                }
                dq.pop_back();
            }
            self_add(dp[i][a[i]] , 1);
            for (int t = a[i] ; t <= m ; t++){
                self_add(dp[i][t] , sum_pre[t - a[i]]);
            }
            dq.push_back(i);
            for (int t = 1 ; t <= m ; t++) self_add(sum_pre[t] , pre[i][t]);
        }
        int ans = 1;
        for (int i = 1 ; i <= n ; i++){
            for (int t = 1 ; t <= m ; t++){
                if (del[i] == 0) self_add(ans , dp[i][t]);
            }
        }
        cout << ans << "\n";
    }
}

void solve(){
    cin >> n >> m;
    for (int i = 1 ; i <= n ; i++) cin >> a[i];
    //if (sub1::check()) return sub1::solve();
    return sub2::solve();
}

#define name "K"

int main(){
    ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    if (fopen(name".INP" , "r")){
        freopen(name".INP" , "r" , stdin);
        freopen(name".OUT" , "w" , stdout);
    }
    int t = 1; //cin >> t;
    while (t--) solve();
    return 0;
}

