T1:
#include<bits/stdc++.h>
using namespace std;
const int N=25010;
const int K=30;
const int MOD=1e9+7;
int f[N][K][K][2],g[N][K][K][2],n,k;
int R[N][K],L[N][K],tmp[K][2],pos[N],h[N];
void update(int &x,int y) {
x+=y;
if(x>=MOD)x-=MOD;
}
void work(int f[N][K][K][2],int L[N][K]) {
L[0][1]=0;
for(int i=1; i<=n; i++) {
int cnt=0,j=1;
for(; j<=k+1&&j<=i&&L[i-1][j]>=h[i]; L[i][++cnt]=L[i-1][j++]);
if(cnt<=k+1)L[i][++cnt]=h[i],pos[i]=cnt;
for(; j<=k+1&&j<=i&&cnt<=k+1; L[i][++cnt]=L[i-1][j++]);
}
f[0][1][0][0]=1;
for(int i=0; i<n; i++)
for(int x=1; x<=k+1; x++)
if(x<=i+1)
for(int j=0; j<=k; j++)
for(int tag=0; tag<2; tag++) {
if(L[i][x]<h[i+1]) {
update(f[i+1][pos[i+1]][j][tag],f[i][x][j][tag]);
if(j<k)update(f[i+1][x+1][j+1][tag^(L[i][x]&1)],f[i][x][j][tag]);
}
else {
update(f[i+1][x][j][tag^((L[i][x]-h[i+1])&1)],f[i][x][j][tag]);
if(j<k)update(f[i+1][x][j+1][tag^(L[i][x]&1)],f[i][x][j][tag]);
}
}
}
int main() {
scanf("%d%d",&n,&k);
for(int i=1; i<=n; i++)scanf("%d",&h[i]);
work(f,L);
reverse(h+1,h+n+1);//反转字符串
work(g,R);
int ans=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=k+1;j++)
for(int tag=1;tag<=2;tag++)
tmp[j-1][tag-1]=0;
for(int x=1;x<=k+1;x++)
if(x<=n-i+1&&L[n-i][x]<h[i])
for(int j=1;j<=k+1;j++)
for(int tag=1;tag<=2;tag++)
update(tmp[j-1][tag-1],f[n-i][x][j-1][tag-1]);
for(int x=1;x<=k+1;x++)
if(x<=i&&R[i-1][x]<=h[i])
for(int j=1;j<=k+1;j++)
for(int tag=1;tag<=2;tag++)
update(ans,1ll*g[i-1][x][j-1][tag-1]*tmp[k-(j-1)][tag-1]%MOD);
}
printf("%d
",ans);
return 0;
}