#include<cstdio>
#include<algorithm>
using namespace std;
const int N=3003,p=1000000007;
int f[N][N],R[N],s[N],i,j,k,n,m,d,x;
char c;

inline char getc()
{
	#define VV 10000000
	static char s[VV],*l=s,*r=s;
	if (l==r)
		l=s,r=s+fread(s,1,VV,stdin);
	return l==r?0:*l++;
}

int read(){ int z=0; do c=getc(); while (c<'0'||c>'9'); while (c>='0'&&c<='9') z*=10,z+=c-'0',c=getc(); return z; }

void chkmax(int &a,int b){ a=a<b?b:a; }

void Plus(int &a,int b){ a+=b,a-=a<p?0:p; }

bool getC()
{
	do c=getc(); while (c<'0'||c>'1');
	return c-'0';
}

int main()
{
	n=read(),m=read();
	for (i=1;i<=n;++i) R[i]=i,s[i]=s[i-1]+getC();
	for (i=1;i<=m;++i) x=read(),chkmax(R[x],read());
	d=R[1],f[1][s[d]]=1;
	for (i=2;i<=n;++i)
	{
		for (j=d-i+2;~j;--j)
		{
			int z=f[i-1][j];
			if (j<d-i+2)
				Plus(f[i][j],z);
			if (j)
				Plus(f[i][j-1],z);
		}
		
		if (d<R[i])
		{
			x=s[R[i]]-s[d],
			d=R[i];
			for (j=R[i]-i+1;j>=x;--j)
				f[i][j]=f[i][j-x];
			fill(f[i],f[i]+x,0);
		}
	}
	printf("%d\n",(f[n][0]+f[n][1])%p);
	return 0;
}
### Prompt

Create a solution in Cpp for the following problem:

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

### Response

```cpp
#include<cstdio>
#include<algorithm>
using namespace std;
const int N=3003,p=1000000007;
int f[N][N],R[N],s[N],i,j,k,n,m,d,x;
char c;

inline char getc()
{
	#define VV 10000000
	static char s[VV],*l=s,*r=s;
	if (l==r)
		l=s,r=s+fread(s,1,VV,stdin);
	return l==r?0:*l++;
}

int read(){ int z=0; do c=getc(); while (c<'0'||c>'9'); while (c>='0'&&c<='9') z*=10,z+=c-'0',c=getc(); return z; }

void chkmax(int &a,int b){ a=a<b?b:a; }

void Plus(int &a,int b){ a+=b,a-=a<p?0:p; }

bool getC()
{
	do c=getc(); while (c<'0'||c>'1');
	return c-'0';
}

int main()
{
	n=read(),m=read();
	for (i=1;i<=n;++i) R[i]=i,s[i]=s[i-1]+getC();
	for (i=1;i<=m;++i) x=read(),chkmax(R[x],read());
	d=R[1],f[1][s[d]]=1;
	for (i=2;i<=n;++i)
	{
		for (j=d-i+2;~j;--j)
		{
			int z=f[i-1][j];
			if (j<d-i+2)
				Plus(f[i][j],z);
			if (j)
				Plus(f[i][j-1],z);
		}
		
		if (d<R[i])
		{
			x=s[R[i]]-s[d],
			d=R[i];
			for (j=R[i]-i+1;j>=x;--j)
				f[i][j]=f[i][j-x];
			fill(f[i],f[i]+x,0);
		}
	}
	printf("%d\n",(f[n][0]+f[n][1])%p);
	return 0;
}
```