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.

Examples

Input

5 2
01001
2 4
3 5


Output

6


Input

9 3
110111110
1 4
4 6
6 9


Output

26


Input

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


Output

143
#include <cstdio>

const int maxn = 3030;

const int mod = 1e9 + 7;

int n, m, far[maxn], dp[maxn][maxn], a[maxn], s[maxn];

int main() {
	scanf("%d%d", &n, &m);
	char c = getchar();
	while(c != '0' && c != '1') {
		c = getchar();
	}
	for (int i = 1; i <= n; ++i) {
		a[i] = c - '0';
		s[i] = s[i - 1] + a[i];
		c = getchar();
	}
	while(m--) {
		int l, r;
		scanf("%d%d", &l, &r);
		(r > far[l]) && (far[l] = r);
	}
	int mx = 0;
	for (int i = 1; i <= n; ++i) {
		(far[i] > mx) ? (mx = far[i]) : (far[i] = 0);
	}
	dp[0][0] = 1;
	for (int i = 1; i <= n; ++i) {
		if(far[i]) {
			for (int j = i; ; ++j) {
				if(j > i && far[j] || j > far[i]) {
					--j;
					for (int k = 0; k + far[i] - j < s[far[i]]; ++k) {
						dp[j][k] = 0;
					}
					i = j;
					break;
				}
				for (int k = 0; k <= s[far[i]]; ++k) {
					dp[j][k] = dp[j - 1][k];
					if(k) {
						(dp[j][k] += dp[j - 1][k - 1]) %= mod;
					}
				}
			}
		}
		else {
			dp[i][s[i]] = dp[i - 1][s[i - 1]];
		}
	}
	printf("%d\n", dp[n][s[n]]);
	return 0;
}