#include #include #include using namespace std; const int MOD = int(1e9) + 7; typedef vector> matrix; matrix mul(const matrix& a, const matrix& b) { matrix c(a.size()); assert(a[0].size() == b.size()); for(int i = 0; i < a.size(); i++) { c[i].resize(b[0].size()); for(int k = 0; k < b.size(); k++) { for(int j = 0; j < b[0].size(); j++) { c[i][j] += a[i][k] * b[k][j]; c[i][j] %= MOD; } } } return c; } matrix fpow(matrix b, int64_t e) { matrix r(b.size()); for(int i = 0; i < b.size(); i++) { r[i].resize(b.size()); r[i][i] = 1; } while(e) { if(e%2) r = mul(r, b); e /= 2; if(e) b = mul(b, b); } return r; } void init(matrix& mat, int amt, bool right) { mat.resize(amt+1); for(int i = 0; i <= amt; i++) mat[i].resize(amt+1); for(int i = 0; i <= amt; i++) { mat[i][i] = 1; if(right) { if(i) mat[i][i-1] = i; if(i+1 <= amt) mat[i][i+1] = amt-i; } else { if(i) mat[i-1][i] = i; if(i+1 <= amt) mat[i+1][i] = amt-i; } } } int main() { int64_t n; int q, scnt, ccnt; cin >> n >> q >> scnt >> ccnt; matrix smat, cmat; init(smat, scnt, true); init(cmat, ccnt, false); matrix ret(scnt+1); for(auto& x: ret) x.resize(ccnt+1); ret[scnt][ccnt] = 1; int64_t lhs = 0; while(q--) { int64_t currt; char loc; int swant, cwant, twant; cin >> currt >> loc >> swant >> cwant >> twant; --currt; int64_t scale = currt - lhs; lhs = currt; matrix spmat = fpow(smat, scale); matrix cpmat = fpow(cmat, scale); ret = mul(spmat, ret); ret = mul(ret, cpmat); for(int i = 0; i <= scnt; i++) for(int j = 0; j <= ccnt; j++) { int shave = (loc == 'A' ? i : scnt - i); int chave = (loc == 'A' ? j : ccnt - j); if(shave < swant || chave < cwant || shave + chave < twant) { ret[i][j] = 0; } } } int64_t scale = n - 1 - lhs; matrix spmat = fpow(smat, scale); matrix cpmat = fpow(cmat, scale); ret = mul(spmat, ret); ret = mul(ret, cpmat); cout << ret[scnt][ccnt] << "\n"; }