#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <string>
#include <sstream>
#include <cstring>
#include <cctype>
#include <cmath>
#include <vector>
#include <set>
#include <map>
#include <stack>
#include <queue>
#include <ctime>
#include <cassert>
#define _for(i,a,b) for(int i=(a);i<(b);++i)
#define _rep(i,a,b) for(int i=(a);i<=(b);++i)
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;
typedef long long LL;
inline int read_int(){
int t=0;bool sign=false;char c=getchar();
while(!isdigit(c)){sign|=c=='-';c=getchar();}
while(isdigit(c)){t=(t<<1)+(t<<3)+(c&15);c=getchar();}
return sign?-t:t;
}
inline LL read_LL(){
LL t=0;bool sign=false;char c=getchar();
while(!isdigit(c)){sign|=c=='-';c=getchar();}
while(isdigit(c)){t=(t<<1)+(t<<3)+(c&15);c=getchar();}
return sign?-t:t;
}
inline char get_char(){
char c=getchar();
while(c==' '||c=='\n'||c=='\r')c=getchar();
return c;
}
inline void write(LL x){
register char c[21],len=0;
if(!x)return putchar('0'),void();
if(x<0)x=-x,putchar('-');
while(x)c[++len]=x%10,x/=10;
while(len)putchar(c[len--]+48);
}
inline void space(LL x){write(x),putchar(' ');}
inline void enter(LL x){write(x),putchar('\n');}
const int MAXN=505,MAXH=1e6+5,mod=1e9+7;
LL frac[MAXH],inv[MAXH];
LL quick_pow(LL a,LL b,LL mod){
LL t=1;
while(b){
if(b&1)
t=t*a%mod;
a=a*a%mod;
b>>=1;
}
return t%mod;
}
void get_inv(){
frac[0]=1;
_for(i,1,MAXH)
frac[i]=frac[i-1]*i%mod;
inv[MAXH-1]=quick_pow(frac[MAXH-1],mod-2,mod);
for(int i=MAXH-2;i>=0;i--)
inv[i]=inv[i+1]*(i+1)%mod;
}
int C(int n,int m){return frac[n]*inv[m]%mod*inv[n-m]%mod;}
int cal(int r,int c,int k){
if(r<k||c<k)
return 0;
return 1LL*C(r,k)*C(c,k)%mod*frac[k]%mod;
}
int Stack[MAXN],v[MAXN],ch[MAXN][2],root;
void build(int n){
int top=0,last=0;
_rep(i,1,n){
while(top&&v[i]<v[Stack[top]])top--;
if(top)ch[Stack[top]][1]=i;
if(top<last)ch[i][0]=Stack[top+1];
Stack[++top]=i;
last=top;
}
root=Stack[1];
}
int sz[MAXN],n,k;
LL f[MAXN][MAXN],g[MAXN][MAXN];
void dfs(int pos,int fa){
if(!pos)
return;
dfs(ch[pos][0],pos);
dfs(ch[pos][1],pos);
sz[pos]=sz[ch[pos][0]]+sz[ch[pos][1]]+1;
_rep(i,0,k)
_rep(j,0,i)
g[pos][i]=(g[pos][i]+f[ch[pos][0]][j]*f[ch[pos][1]][i-j])%mod;
int H=v[pos]-v[fa];
_rep(i,0,k)
_rep(j,0,i){
if(!g[pos][j])
break;
f[pos][i]=(f[pos][i]+g[pos][j]*cal(H,sz[pos]-j,i-j))%mod;
}
}
int main()
{
get_inv();
f[0][0]=g[0][0]=1;
n=read_int(),k=read_int();
_rep(i,1,n)
v[i]=read_int();
build(n);
dfs(root,0);
enter(f[root][k]);
return 0;
}