#include <bits/stdc++.h>

using namespace std;

typedef long double ld;
typedef long long ll;

const int M = 3030;
const int mod = 1e9 + 7;

int add(int x, int y) {
  x += y;
  if (x >= mod)
    x -= mod;
  return x;
}

int udd(int &x, int y) {
  return x = add(x, y);
}

int n, m;
int l[M], r[M];
int up[M], down[M];
int d[M][M];
string s;

void read() {
  cin >> n >> m >> s;
  for (int i = 0; i < m; ++i) {
    int l, r;
    cin >> l >> r;
    --l;
    ::l[i] = l;
    ::r[i] = r;
  }
}

void calc(string s, function<bool(char, char)> cmp, int *to) {
  for (int i = 0; i < m; ++i)
    sort(s.begin() + l[i], s.begin() + r[i], cmp);
  for (int i = 0; i < n; ++i)
    to[i + 1] = to[i] + (s[i] - '0');
}

void kill() {
  calc(s, less<char>(), down);
  calc(s, greater<char>(), up);
  d[0][0] = 1;
  int A = down[n];
  int B = n - A;
  for (int i = 0; i <= A; ++i)
    for (int j = 0; j <= B; ++j) {
      int k = i + j;
      if (down[k] <= i && i <= up[k]) {
        int cur = d[i][j];
        udd(d[i + 1][j], cur);
        udd(d[i][j + 1], cur);
      }
    }

  cout << d[A][B] << endl;
}

int main() {
#ifdef LOCAL
  assert(freopen("f.in", "r", stdin));
#endif

  ios_base::sync_with_stdio(false);

  read();
  kill();
}

