//void __(){
//    _(int,n);
//    _(int,m);
//    _(string,s);
//    string s_lo = s, s_hi = s;
//    rep(i,m){
//        _(int,l);
//        _(int,r);
//        --l;
//        sort(s_lo.begin()+l,s_lo.begin()+r);
//        sort(s_hi.begin()+l,s_hi.begin()+r);
//        reverse(s_hi.begin()+l,s_hi.begin()+r);
//    }
//    vi lo(n), hi(n);
//    {
//        int cnt = 0;
//        rep(i,n)
//            if(s_lo[i] == '1'){
//                hi[cnt] = i;
//                ++cnt;
//            }
//    }
//    {
//        int cnt = 0;
//        rep(i,n)
//            if(s_hi[i] == '1'){
//                lo[cnt] = i;
//                ++cnt;
//            }
//    }
//    vvi dp(n+1,vi(n+1));
//    dp[0][0] = 1;
//    rep(i,n)
//        rep(ones,i+1){
//            if(!dp[i][ones]) continue;
//            if(lo[ones] <= i && i <= hi[ones]){
//                dp[i+1][ones+1] += dp[i][ones];
//                if(dp[i+1][ones+1] >= MOD)
//                    dp[i+1][ones+1] -= MOD;
//            }
//            dp[i+1][ones] += dp[i][ones];
//            if(dp[i+1][ones] >= MOD)
//                dp[i+1][ones] -= MOD;
//        }
//    int ones = count(all(s),'1');
//    print dp[n][ones];
//}
//
#include <iomanip>
#include <algorithm>
#include <vector>
#include <utility>
#include <iostream>
#include <string>
#define REP_ZERO_INT(i,r) for(int i = 0; i < r; ++i)
#define GET_REP_MACRO(_1,_2,_3,_4,NAME,...) NAME
#define rep(...) GET_REP_MACRO(__VA_ARGS__,REP_ANY,REP_INT,REP_ZERO_INT)(__VA_ARGS__)
#define all(v) (v).begin(), (v).end()
#define sz(v) ll(v.size())
#define T1 template<typename T> static
using namespace std;
typedef long long ll;
typedef vector<int> vi;
typedef vector<vi> vvi;
const ll MOD = 1e9 + 7;
T1 ostream& operator<<(ostream& stream, const vector<T>& t);
T1 istream& read(T, T, istream& = cin);
struct _print {
    string sep,end;
    bool space;
    ostream &stream;
    _print(string _sep=" ",string _end="\n",
            ostream &_stream = cout)
        : sep(_sep),end(_end),space(false),
            stream(_stream) {}
    ~_print() { stream << end; }
    template <typename T>
        _print &operator , (const T &t) {
            if (space) stream << sep;
            space = true;
            stream << t;
            return *this;
        }
};
#define print _print(),
#define INPUT_WITHOUT_INIT(type,name) type name; cin >> name
#define GET_INPUT_MACRO(_1,_2,_3,_4,_5,_6,_7,_8,NAME,...) NAME
#define _(...) GET_INPUT_MACRO(__VA_ARGS__,_IWI,_IWI,_IWI,_IWI,_IWI,_IWI,INPUT_WITHOUT_INIT)(__VA_ARGS__)
void __(){
    _(int,n);
    _(int,m);
    _(string,s);
    string s_lo = s, s_hi = s;
    rep(i,m){
        _(int,l);
        _(int,r);
        --l;
        sort(s_lo.begin()+l,s_lo.begin()+r);
        sort(s_hi.begin()+l,s_hi.begin()+r);
        reverse(s_hi.begin()+l,s_hi.begin()+r);
    }
    vi lo(n), hi(n);
    {
        int cnt = 0;
        rep(i,n)
            if(s_lo[i] == '1'){
                hi[cnt] = i;
                ++cnt;
            }
    }
    {
        int cnt = 0;
        rep(i,n)
            if(s_hi[i] == '1'){
                lo[cnt] = i;
                ++cnt;
            }
    }
    vvi dp(n+1,vi(n+1));
    dp[0][0] = 1;
    rep(i,n)
        rep(ones,i+1){
            if(!dp[i][ones]) continue;
            if(lo[ones] <= i && i <= hi[ones]){
                dp[i+1][ones+1] += dp[i][ones];
                if(dp[i+1][ones+1] >= MOD)
                    dp[i+1][ones+1] -= MOD;
            }
            dp[i+1][ones] += dp[i][ones];
            if(dp[i+1][ones] >= MOD)
                dp[i+1][ones] -= MOD;
        }
    int ones = count(all(s),'1');
    print dp[n][ones];
}
int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    cout << fixed << setprecision(15);
        __();
}


Measured memory_bytes: 35712