Problem:
Score : 900 points

Problem Statement

There is a string S of length N consisting of characters 0 and 1. You will perform the following operation for each i = 1, 2, ..., m:

Arbitrarily permute the characters within the substring of S starting at the l_i-th character from the left and extending through the r_i-th character.

Here, the sequence l_i is non-decreasing.

How many values are possible for S after the M operations, modulo 1000000007(= 10^9+7)?

Constraints

2≦N≦3000

1≦M≦3000

S consists of characters 0 and 1.

The length of S equals N.

1≦l_i < r_i≦N

l_i ≦ l_{i+1}

Input

The input is given from Standard Input in the following format:

N M
S
l_1 r_1
:
l_M r_M

Output

Print the number of the possible values for S after the M operations, modulo 1000000007.

Sample Input 1

5 2
01001
2 4
3 5

Sample Output 1

6

After the first operation, S can be one of the following three: 01001, 00101 and 00011.

After the second operation, S can be one of the following six: 01100, 01010, 01001, 00011, 00101 and 00110.

Sample Input 2

9 3
110111110
1 4
4 6
6 9

Sample Output 2

26

Sample Input 3

11 6
00101000110
2 4
2 3
4 7
5 6
6 10
10 11

Sample Output 3

143

Solution in Fortran (gfortran v4.8.4) (judge verdict: Accepted)

program shuffling
  implicit none
  integer(8), parameter :: md = 1000000007_8
  integer :: n, m, i, j, k, l, r, x(0:3001) = 0, c(0:3001) = 0
  character(3001) :: s
  integer(8) :: dp(0:3001,0:3001) = 0_8
  read(*,*) n, m
  read(*,*) s
  s(n+1:n+1) = "0"
  do i = 1, m
    read(*,*) l, r
    x(l) = max(x(l),r)
  end do
  do i = 1, n+1
    x(i) = max(x(i-1),x(i),i)
    c(i) = c(i-1)+ichar(s(i:i))-48
  end do
  dp(1,c(x(1))) = 1_8
  do i = 1, n
    k = c(x(i+1))-c(x(i))
    dp(i+1,k) = mod(dp(i+1,k)+dp(i,0),md)
    do j = 1, n-k
      dp(i+1,k+j-1) = mod(dp(i+1,k+j-1)+dp(i,j),md)
      if (x(i)-i >= j) dp(i+1,k+j) = mod(dp(i+1,k+j)+dp(i,j),md)
    end do
  end do
  write(*,'(i0)') dp(n+1,0)
end program shuffling