#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;
}