package main
import (
"bufio"
"fmt"
"os"
"sort"
)
const MOD int64 = 1000000007
var fact []int64
var invFact []int64
func power(base, exp int64) int64 {
var res int64 = 1
base %= MOD
for exp > 0 {
if exp%2 == 1 {
res = (res * base) % MOD
}
base = (base * base) % MOD
exp /= 2
}
return res
}
func initComb(n int) {
fact = make([]int64, n+1)
invFact = make([]int64, n+1)
fact[0] = 1
invFact[0] = 1
for i := 1; i <= n; i++ {
fact[i] = (fact[i-1] * int64(i)) % MOD
}
invFact[n] = power(fact[n], MOD-2)
for i := n - 1; i >= 1; i-- {
invFact[i] = (invFact[i+1] * int64(i+1)) % MOD
}
}
func C(n, k int) int64 {
if k < 0 || k > n {
return 0
}
num := fact[n]
den := (invFact[k] * invFact[n-k]) % MOD
return (num * den) % MOD
}
type Fixed struct {
U int
P int
}
func main() {
reader := bufio.NewReader(os.Stdin)
var n int
if _, err := fmt.Fscan(reader, &n); err != nil {
return
}
initComb(n)
var fixed []Fixed
for i := 1; i <= n; i++ {
var u int
fmt.Fscan(reader, &u)
if u > 0 {
fixed = append(fixed, Fixed{U: u, P: i})
}
}
sort.Slice(fixed, func(i, j int) bool {
return fixed[i].U > fixed[j].U
})
states := make(map[int]int64)
states[1] = 1
v_prev := n
for _, f := range fixed {
U := f.U
P := f.P
delta := v_prev - U
if delta < 0 {
fmt.Println(0)
return
}
newStates := make(map[int]int64)
for L_prev, ways := range states {
L_new1 := P
new_L1 := P + 1
k1 := L_new1 - L_prev
if k1 >= 0 && k1 <= delta {
ways_add := (ways * C(delta, k1)) % MOD
newStates[new_L1] = (newStates[new_L1] + ways_add) % MOD
}
if U > 1 {
L_new2 := P - U + 1
new_L2 := P - U + 1
k2 := L_new2 - L_prev
if k2 >= 0 && k2 <= delta {
ways_add := (ways * C(delta, k2)) % MOD
newStates[new_L2] = (newStates[new_L2] + ways_add) % MOD
}
}
}
states = newStates
v_prev = U - 1
}
var ans int64 = 0
for _, ways := range states {
ans = (ans + ways) % MOD
}
if v_prev > 0 {
ans = (ans * power(2, int64(v_prev-1))) % MOD
}
fmt.Println(ans)
}