#include #include #include #include #include using namespace std; using lint = long long; #include struct S { lint n0 = 0; lint n1 = 0; lint v00 = 0; lint v01 = 0; lint v10 = 0; lint v11 = 0; lint v01e = 0; lint v11e = 0; lint n1e = 0; }; S op(S l, S r) { S res; res.n0 = r.n0 + l.n0 * r.v00 + l.n1 * r.v10; res.n1 = r.n1 + l.n0 * r.v01 + l.n1 * r.v11; res.v00 = l.v00 * r.v00 + l.v01 * r.v10; res.v01 = l.v00 * r.v01 + l.v01 * r.v11; res.v10 = l.v10 * r.v00 + l.v11 * r.v10; res.v11 = l.v10 * r.v01 + l.v11 * r.v11; res.v01e = l.v01e + l.v00 * r.v01e + l.v01 * r.v11e; res.v11e = l.v11e + l.v10 * r.v01e + l.v11 * r.v11e; res.n1e = l.n1e + r.n1e + l.n0 * r.v01e + l.n1 * r.v11e; return res; } S e() { return {0, 0, 1, 0, 0, 1, 0, 0, 0}; } S Gen(string c) { if (c == "F") return {1, 0, 0, 0, 0, 0, 0, 0, 0}; if (c == "T") return {0, 1, 0, 0, 0, 0, 0, 0, 1}; if (c == "+F") return {1, 0, 1, 0, 0, 1, 0, 1, 0}; if (c == "+T") return {0, 1, 0, 1, 0, 1, 1, 1, 1}; if (c == "*F") return {1, 0, 1, 0, 1, 0, 0, 0, 0}; if (c == "*T") return {0, 1, 1, 0, 0, 1, 0, 1, 1}; if (c == "^F") return {1, 0, 1, 0, 0, 1, 0, 1, 0}; if (c == "^T") return {0, 1, 0, 1, 1, 0, 1, 0, 1}; assert(false); } int main() { cin.tie(nullptr), ios::sync_with_stdio(false); int N, Q; string X; cin >> N >> Q >> X; vector init; for (int i = 1; i < N; i += 2) init.emplace_back(Gen(X.substr(i, 2))); const atcoder::segtree seg(init); while (Q--) { int L, R; cin >> L >> R; --L; if (L % 2) ++L; if (R % 2 == 0) --R; if (L >= R) { cout << 0 << '\n'; } else { cout << op(Gen(X.substr(L, 1)), seg.prod(L / 2, R / 2)).n1e << '\n'; } } }