package main
import (
"fmt"
)
func main() {
var n, p int
if _, err := fmt.Scan(&n, &p); err != nil {
return
}
c := make([]int, n+1)
for i := 1; i <= n; i++ {
fmt.Scan(&c[i])
}
MOD := 1000000007
pow2 := make([]int, n+1)
pow2[0] = 1
for i := 1; i <= n; i++ {
pow2[i] = (pow2[i-1] * 2) % MOD
}
dp := make([][][]int, 2)
for i := 0; i < 2; i++ {
dp[i] = make([][]int, 2)
for j := 0; j < 2; j++ {
dp[i][j] = make([]int, 2)
}
}
dp[0][0][0] = 1
for i := 1; i <= n; i++ {
nextDp := make([][][]int, 2)
for j := 0; j < 2; j++ {
nextDp[j] = make([][]int, 2)
for k := 0; k < 2; k++ {
nextDp[j][k] = make([]int, 2)
}
}
for color := 0; color <= 1; color++ {
if c[i] != -1 && c[i] != color {
continue
}
for h0 := 0; h0 <= 1; h0++ {
for h1 := 0; h1 <= 1; h1++ {
for par := 0; par <= 1; par++ {
ways := dp[h0][h1][par]
if ways == 0 {
continue
}
var oppH int
if color == 0 {
oppH = h1
} else {
oppH = h0
}
if oppH == 0 {
nextWays := (ways * pow2[i-1]) % MOD
newPar := par ^ 1
newH0 := h0
if color == 0 {
newH0 = 1
}
newH1 := h1
if color == 1 {
newH1 = 1
}
nextDp[newH0][newH1][newPar] = (nextDp[newH0][newH1][newPar] + nextWays) % MOD
} else {
nextWays := (ways * pow2[i-2]) % MOD
newPar0 := par
newH0_0 := h0
newH1_0 := h1
nextDp[newH0_0][newH1_0][newPar0] = (nextDp[newH0_0][newH1_0][newPar0] + nextWays) % MOD
newPar1 := par ^ 1
newH0_1 := h0
if color == 0 {
newH0_1 = 1
}
newH1_1 := h1
if color == 1 {
newH1_1 = 1
}
nextDp[newH0_1][newH1_1][newPar1] = (nextDp[newH0_1][newH1_1][newPar1] + nextWays) % MOD
}
}
}
}
}
dp = nextDp
}
ans := 0
for h0 := 0; h0 <= 1; h0++ {
for h1 := 0; h1 <= 1; h1++ {
ans = (ans + dp[h0][h1][p]) % MOD
}
}
fmt.Println(ans)
}