// #pragma GCC optimize("O3", "unroll-loops")
// #pragma GCC target("avx2", "bmi", "bmi2", "lzcnt", "popcnt")
#include <bits/stdc++.h>
#define ldb long double
// #define double ldb
#define db double
#define unomap unordered_map
#define unoset unordered_set
#define endl '\n'
#define str string
#define strstr stringstream
#define sz(a) (int)a.size()
#define ll long long
// #define int ll
#define pii pair<int, int>
#define pll pair<ll, ll>
#define Unique(a) a.resize(unique(all(a)) - a.begin())
#define ull unsigned long long
#define fir first
#define sec second
#define idc cin.ignore()
#define lb lower_bound
#define ub upper_bound
#define all(s) s.begin(), s.end()
#define rall(s) s.rbegin(), s.rend()
#define rev reverse
#define gcd __gcd
#define pushb push_back
#define popb pop_back
#define pushf push_front
#define popf pop_front
#define emp emplace
#define empb emplace_back
#define mul2x(a, x) a << x
#define div2x(a, x) a >> x
#define lcm(a, b) (a / __gcd(a, b) * b)
#define log_base(x, base) log(x) / log(base)
#define debug cerr << "No errors!", exit(0);
#define forw(i, a, b) for (int i = a; i <= b; ++i)
#define forw2(i, a, b) for (ll i = a; i <= b; ++i)
#define fors(i, a, b) for (int i = a; i >= b; --i)
#define fors2(i, a, b) for (ll i = a; i >= b; --i)
#define pqueue priority_queue
#define sqrt sqrtl
#define i128 __int128
#define popcount __builtin_popcountll
#define BIT(x, i) (((x) >> (i)) & 1)
#define MASK(x) ((1LL) << (x))
#define want_digit(x) cout << fixed << setprecision(x);
#define excuting_time 1000.0 * clock() / CLOCKS_PER_SEC
#define mapa make_pair
using namespace std;
const int MOD = 1e9 + 7; // 998244353;
const int inf = 1e9;
const ll INF = 1e18; // MASK(63) - 1
const int limN = 5e4 + 5;
mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count());
inline ll random(const ll &L, const ll &R) {
return uniform_int_distribution<ll>(L, R)(rng);
}
/* -------~~~~~~===== END OF TEMPLATE =====~~~~~~------- */
int mul(const int &x, const int &y) {
return (1LL * x * y) % MOD;
}
int add(const int &x, const int &y) {
return (x + y) % MOD;
}
struct Node {
int v, o, i, _2, _6, vo, voi, voi2, voi26, oi, oi2, oi26, i2, i26, _26;
Node () {
v = o = i = _2 = _6 = vo = voi = voi2 =
voi26 = oi = oi2 = oi26 = i2 = i26 = _26 = 0;
}
};
Node operator + (const Node &a, const Node &b) {
Node r;
// 1 ký tự
r.v = add(a.v, b.v); r.o = add(a.o, b.o); r.i = add(a.i, b.i);
r._2 = add(a._2, b._2); r._6 = add(a._6, b._6);
// 2 ký tự
r.vo = add(add(a.vo, b.vo), mul(a.v, b.o));
r.oi = add(add(a.oi, b.oi), mul(a.o, b.i));
r.i2 = add(add(a.i2, b.i2), mul(a.i, b._2));
r._26 = add(add(a._26, b._26), mul(a._2, b._6));
// 3 ký tự
r.voi = add(add(add(a.voi, b.voi), mul(a.v, b.oi)), mul(a.vo, b.i));
r.oi2 = add(add(add(a.oi2, b.oi2), mul(a.oi, b._2)), mul(a.o, b.i2));
r.i26 = add(add(add(a.i26, b.i26), mul(a.i, b._26)), mul(a.i2, b._6));
// 4 ký tự
r.voi2 = add(add(add(add(a.voi2, b.voi2), mul(a.v, b.oi2)), mul(a.vo, b.i2)), mul(a.voi, b._2));
r.oi26 = add(add(add(add(a.oi26, b.oi26), mul(a.oi2, b._6)), mul(a.o, b.i26)), mul(a.oi, b._26));
// 5 ký tự (Bro dài điên T^T)
r.voi26 = add(add(add(add(add(a.voi26, b.voi26), mul(a.v, b.oi26)), mul(a.vo, b.i26)), mul(a.voi, b._26)), mul(a.voi2, b._6));
return r;
}
struct SegmentTree {
int n;
vector <Node> seg;
SegmentTree(int _n) {
n = _n;
seg.resize(n * 4 + 1, Node());
}
void update(int id, int l, int r, int pos, char v) {
if (l > pos || pos > r) return;
if (l == r) {
if (v == 'V') ++seg[id].v;
else if (v == 'O') ++seg[id].o;
else if (v == 'I') ++seg[id].i;
else if (v == '2') ++seg[id]._2;
else if (v == '6') ++seg[id]._6;
return;
}
int mid = (l + r) >> 1;
update(id << 1, l, mid, pos, v);
update(id << 1 | 1, mid + 1, r, pos, v);
seg[id] = seg[id << 1] + seg[id << 1 | 1];
}
Node get(int id, int l, int r, int u, int v) {
if (l > v || u > r) return Node();
if (u <= l && r <= v) return seg[id];
int mid = (l + r) >> 1;
return get(id << 1, l, mid, u, v) + get(id << 1 | 1, mid + 1, r, u, v);
}
void update(int pos, char v) { update(1, 1, n, pos, v); }
Node get(int u, int v) {
return get(1, 1, n, u, v);
}
};
int n, q;
str s;
void solve() {
cin >> n >> q >> s;
s = " " + s;
SegmentTree IT(n);
forw (i, 1, n) IT.update(i, s[i]);
while (q--) {
int l, r; cin >> l >> r;
Node ret = IT.get(l, r);
cout << ret.voi26 << endl;
}
}
signed main() {
ios::sync_with_stdio(false), cin.tie(nullptr);
srand(time(NULL));
#define name "test"
if (fopen(name ".INP", "r")) {
freopen(name ".INP", "r", stdin);
freopen(name ".OUT", "w", stdout);
}
bool testCase = false;
int numTest = 1;
// cin >> numTest;
forw (i, 1, numTest) {
if (testCase) cout << "Case #" << i << ": ";
solve();
}
return 0;
}
Ly8gI3ByYWdtYSBHQ0Mgb3B0aW1pemUoIk8zIiwgInVucm9sbC1sb29wcyIpCi8vICNwcmFnbWEgR0NDIHRhcmdldCgiYXZ4MiIsICJibWkiLCAiYm1pMiIsICJsemNudCIsICJwb3BjbnQiKQoKI2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CiNkZWZpbmUgbGRiIGxvbmcgZG91YmxlCi8vICNkZWZpbmUgZG91YmxlIGxkYgojZGVmaW5lIGRiIGRvdWJsZQojZGVmaW5lIHVub21hcCB1bm9yZGVyZWRfbWFwCiNkZWZpbmUgdW5vc2V0IHVub3JkZXJlZF9zZXQKI2RlZmluZSBlbmRsICdcbicKI2RlZmluZSBzdHIgc3RyaW5nCiNkZWZpbmUgc3Ryc3RyIHN0cmluZ3N0cmVhbQojZGVmaW5lIHN6KGEpIChpbnQpYS5zaXplKCkKI2RlZmluZSBsbCBsb25nIGxvbmcKLy8gI2RlZmluZSBpbnQgbGwKI2RlZmluZSBwaWkgcGFpcjxpbnQsIGludD4KI2RlZmluZSBwbGwgcGFpcjxsbCwgbGw+CiNkZWZpbmUgVW5pcXVlKGEpIGEucmVzaXplKHVuaXF1ZShhbGwoYSkpIC0gYS5iZWdpbigpKQojZGVmaW5lIHVsbCB1bnNpZ25lZCBsb25nIGxvbmcKI2RlZmluZSBmaXIgZmlyc3QKI2RlZmluZSBzZWMgc2Vjb25kCiNkZWZpbmUgaWRjIGNpbi5pZ25vcmUoKQojZGVmaW5lIGxiIGxvd2VyX2JvdW5kCiNkZWZpbmUgdWIgdXBwZXJfYm91bmQKI2RlZmluZSBhbGwocykgcy5iZWdpbigpLCBzLmVuZCgpCiNkZWZpbmUgcmFsbChzKSBzLnJiZWdpbigpLCBzLnJlbmQoKQojZGVmaW5lIHJldiByZXZlcnNlCiNkZWZpbmUgZ2NkIF9fZ2NkCiNkZWZpbmUgcHVzaGIgcHVzaF9iYWNrCiNkZWZpbmUgcG9wYiBwb3BfYmFjawojZGVmaW5lIHB1c2hmIHB1c2hfZnJvbnQKI2RlZmluZSBwb3BmIHBvcF9mcm9udAojZGVmaW5lIGVtcCBlbXBsYWNlCiNkZWZpbmUgZW1wYiBlbXBsYWNlX2JhY2sKI2RlZmluZSBtdWwyeChhLCB4KSBhIDw8IHgKI2RlZmluZSBkaXYyeChhLCB4KSBhID4+IHgKI2RlZmluZSBsY20oYSwgYikgKGEgLyBfX2djZChhLCBiKSAqIGIpCiNkZWZpbmUgbG9nX2Jhc2UoeCwgYmFzZSkgbG9nKHgpIC8gbG9nKGJhc2UpCiNkZWZpbmUgZGVidWcgY2VyciA8PCAiTm8gZXJyb3JzISIsIGV4aXQoMCk7CiNkZWZpbmUgZm9ydyhpLCBhLCBiKSBmb3IgKGludCBpID0gYTsgaSA8PSBiOyArK2kpCiNkZWZpbmUgZm9ydzIoaSwgYSwgYikgZm9yIChsbCBpID0gYTsgaSA8PSBiOyArK2kpCiNkZWZpbmUgZm9ycyhpLCBhLCBiKSBmb3IgKGludCBpID0gYTsgaSA+PSBiOyAtLWkpCiNkZWZpbmUgZm9yczIoaSwgYSwgYikgZm9yIChsbCBpID0gYTsgaSA+PSBiOyAtLWkpCiNkZWZpbmUgcHF1ZXVlIHByaW9yaXR5X3F1ZXVlCiNkZWZpbmUgc3FydCBzcXJ0bAojZGVmaW5lIGkxMjggX19pbnQxMjgKI2RlZmluZSBwb3Bjb3VudCBfX2J1aWx0aW5fcG9wY291bnRsbAojZGVmaW5lIEJJVCh4LCBpKSAoKCh4KSA+PiAoaSkpICYgMSkKI2RlZmluZSBNQVNLKHgpICgoMUxMKSA8PCAoeCkpCiNkZWZpbmUgd2FudF9kaWdpdCh4KSBjb3V0IDw8IGZpeGVkIDw8IHNldHByZWNpc2lvbih4KTsKI2RlZmluZSBleGN1dGluZ190aW1lIDEwMDAuMCAqIGNsb2NrKCkgLyBDTE9DS1NfUEVSX1NFQwojZGVmaW5lIG1hcGEgbWFrZV9wYWlyCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CmNvbnN0IGludCBNT0QgPSAxZTkgKyA3OyAvLyA5OTgyNDQzNTM7CmNvbnN0IGludCBpbmYgPSAxZTk7CmNvbnN0IGxsIElORiA9IDFlMTg7IC8vIE1BU0soNjMpIC0gMQpjb25zdCBpbnQgbGltTiA9IDVlNCArIDU7CgptdDE5OTM3XzY0IHJuZyhjaHJvbm86OnN0ZWFkeV9jbG9jazo6bm93KCkudGltZV9zaW5jZV9lcG9jaCgpLmNvdW50KCkpOwppbmxpbmUgbGwgcmFuZG9tKGNvbnN0IGxsICZMLCBjb25zdCBsbCAmUikgewogIHJldHVybiB1bmlmb3JtX2ludF9kaXN0cmlidXRpb248bGw+KEwsIFIpKHJuZyk7Cn0KCi8qIC0tLS0tLS1+fn5+fn49PT09PSBFTkQgT0YgVEVNUExBVEUgPT09PT1+fn5+fn4tLS0tLS0tICovCgppbnQgbXVsKGNvbnN0IGludCAmeCwgY29uc3QgaW50ICZ5KSB7CiAgICByZXR1cm4gKDFMTCAqIHggKiB5KSAlIE1PRDsKfQoKaW50IGFkZChjb25zdCBpbnQgJngsIGNvbnN0IGludCAmeSkgewogICAgcmV0dXJuICh4ICsgeSkgJSBNT0Q7Cn0KCnN0cnVjdCBOb2RlIHsKICAgIGludCB2LCBvLCBpLCBfMiwgXzYsIHZvLCB2b2ksIHZvaTIsIHZvaTI2LCBvaSwgb2kyLCBvaTI2LCBpMiwgaTI2LCBfMjY7CiAgICBOb2RlICgpIHsKICAgICAgICB2ID0gbyA9IGkgPSBfMiA9IF82ID0gdm8gPSB2b2kgPSB2b2kyID0gCiAgICAgICAgdm9pMjYgPSBvaSA9IG9pMiA9IG9pMjYgPSBpMiA9IGkyNiA9IF8yNiA9IDA7CiAgICB9Cn07CgpOb2RlIG9wZXJhdG9yICsgKGNvbnN0IE5vZGUgJmEsIGNvbnN0IE5vZGUgJmIpIHsKICAgIE5vZGUgcjsKICAgIC8vIDEga8O9IHThu7EKICAgIHIudiA9IGFkZChhLnYsIGIudik7IHIubyA9IGFkZChhLm8sIGIubyk7IHIuaSA9IGFkZChhLmksIGIuaSk7IAogICAgci5fMiA9IGFkZChhLl8yLCBiLl8yKTsgci5fNiA9IGFkZChhLl82LCBiLl82KTsKCiAgICAvLyAyIGvDvSB04buxCiAgICByLnZvID0gYWRkKGFkZChhLnZvLCBiLnZvKSwgbXVsKGEudiwgYi5vKSk7CiAgICByLm9pID0gYWRkKGFkZChhLm9pLCBiLm9pKSwgbXVsKGEubywgYi5pKSk7CiAgICByLmkyID0gYWRkKGFkZChhLmkyLCBiLmkyKSwgbXVsKGEuaSwgYi5fMikpOwogICAgci5fMjYgPSBhZGQoYWRkKGEuXzI2LCBiLl8yNiksIG11bChhLl8yLCBiLl82KSk7CgogICAgLy8gMyBrw70gdOG7sQogICAgci52b2kgPSBhZGQoYWRkKGFkZChhLnZvaSwgYi52b2kpLCBtdWwoYS52LCBiLm9pKSksIG11bChhLnZvLCBiLmkpKTsKICAgIHIub2kyID0gYWRkKGFkZChhZGQoYS5vaTIsIGIub2kyKSwgbXVsKGEub2ksIGIuXzIpKSwgbXVsKGEubywgYi5pMikpOwogICAgci5pMjYgPSBhZGQoYWRkKGFkZChhLmkyNiwgYi5pMjYpLCBtdWwoYS5pLCBiLl8yNikpLCBtdWwoYS5pMiwgYi5fNikpOwogICAgCiAgICAvLyA0IGvDvSB04buxIAogICAgci52b2kyID0gYWRkKGFkZChhZGQoYWRkKGEudm9pMiwgYi52b2kyKSwgbXVsKGEudiwgYi5vaTIpKSwgbXVsKGEudm8sIGIuaTIpKSwgbXVsKGEudm9pLCBiLl8yKSk7CiAgICByLm9pMjYgPSBhZGQoYWRkKGFkZChhZGQoYS5vaTI2LCBiLm9pMjYpLCBtdWwoYS5vaTIsIGIuXzYpKSwgbXVsKGEubywgYi5pMjYpKSwgbXVsKGEub2ksIGIuXzI2KSk7CgogICAgLy8gNSBrw70gdOG7sSAoQnJvIGTDoGkgxJFpw6puIFReVCkKICAgIHIudm9pMjYgPSBhZGQoYWRkKGFkZChhZGQoYWRkKGEudm9pMjYsIGIudm9pMjYpLCBtdWwoYS52LCBiLm9pMjYpKSwgbXVsKGEudm8sIGIuaTI2KSksIG11bChhLnZvaSwgYi5fMjYpKSwgbXVsKGEudm9pMiwgYi5fNikpOwogICAgcmV0dXJuIHI7Cn0KCnN0cnVjdCBTZWdtZW50VHJlZSB7CiAgICBpbnQgbjsKICAgIHZlY3RvciA8Tm9kZT4gc2VnOwoKICAgIFNlZ21lbnRUcmVlKGludCBfbikgewogICAgICAgIG4gPSBfbjsKICAgICAgICBzZWcucmVzaXplKG4gKiA0ICsgMSwgTm9kZSgpKTsKICAgIH0KCiAgICB2b2lkIHVwZGF0ZShpbnQgaWQsIGludCBsLCBpbnQgciwgaW50IHBvcywgY2hhciB2KSB7CiAgICAgICAgaWYgKGwgPiBwb3MgfHwgcG9zID4gcikgcmV0dXJuOwogICAgICAgIGlmIChsID09IHIpIHsKICAgICAgICAgICAgaWYgKHYgPT0gJ1YnKSArK3NlZ1tpZF0udjsKICAgICAgICAgICAgZWxzZSBpZiAodiA9PSAnTycpICsrc2VnW2lkXS5vOwogICAgICAgICAgICBlbHNlIGlmICh2ID09ICdJJykgKytzZWdbaWRdLmk7CiAgICAgICAgICAgIGVsc2UgaWYgKHYgPT0gJzInKSArK3NlZ1tpZF0uXzI7CiAgICAgICAgICAgIGVsc2UgaWYgKHYgPT0gJzYnKSArK3NlZ1tpZF0uXzY7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIGludCBtaWQgPSAobCArIHIpID4+IDE7CiAgICAgICAgdXBkYXRlKGlkIDw8IDEsIGwsIG1pZCwgcG9zLCB2KTsKICAgICAgICB1cGRhdGUoaWQgPDwgMSB8IDEsIG1pZCArIDEsIHIsIHBvcywgdik7CiAgICAgICAgc2VnW2lkXSA9IHNlZ1tpZCA8PCAxXSArIHNlZ1tpZCA8PCAxIHwgMV07CiAgICB9CgogICAgTm9kZSBnZXQoaW50IGlkLCBpbnQgbCwgaW50IHIsIGludCB1LCBpbnQgdikgewogICAgICAgIGlmIChsID4gdiB8fCB1ID4gcikgcmV0dXJuIE5vZGUoKTsKICAgICAgICBpZiAodSA8PSBsICYmIHIgPD0gdikgcmV0dXJuIHNlZ1tpZF07CiAgICAgICAgaW50IG1pZCA9IChsICsgcikgPj4gMTsKICAgICAgICByZXR1cm4gZ2V0KGlkIDw8IDEsIGwsIG1pZCwgdSwgdikgKyBnZXQoaWQgPDwgMSB8IDEsIG1pZCArIDEsIHIsIHUsIHYpOwogICAgfQogICAgCiAgICB2b2lkIHVwZGF0ZShpbnQgcG9zLCBjaGFyIHYpIHsgdXBkYXRlKDEsIDEsIG4sIHBvcywgdik7IH0KICAgIE5vZGUgZ2V0KGludCB1LCBpbnQgdikgewogICAgICAgIHJldHVybiBnZXQoMSwgMSwgbiwgdSwgdik7CiAgICB9Cn07CgppbnQgbiwgcTsKc3RyIHM7Cgp2b2lkIHNvbHZlKCkgewogICAgY2luID4+IG4gPj4gcSA+PiBzOwogICAgcyA9ICIgIiArIHM7CiAgICBTZWdtZW50VHJlZSBJVChuKTsKICAgIGZvcncgKGksIDEsIG4pIElULnVwZGF0ZShpLCBzW2ldKTsKCiAgICB3aGlsZSAocS0tKSB7CiAgICAgICAgaW50IGwsIHI7IGNpbiA+PiBsID4+IHI7CiAgICAgICAgTm9kZSByZXQgPSBJVC5nZXQobCwgcik7CiAgICAgICAgY291dCA8PCByZXQudm9pMjYgPDwgZW5kbDsKICAgIH0KfQoKc2lnbmVkIG1haW4oKSB7CiAgICBpb3M6OnN5bmNfd2l0aF9zdGRpbyhmYWxzZSksIGNpbi50aWUobnVsbHB0cik7CiAgICBzcmFuZCh0aW1lKE5VTEwpKTsKICAgICNkZWZpbmUgbmFtZSAidGVzdCIKICAgIGlmIChmb3BlbihuYW1lICIuSU5QIiwgInIiKSkgewogICAgICAgIGZyZW9wZW4obmFtZSAiLklOUCIsICJyIiwgc3RkaW4pOwogICAgICAgIGZyZW9wZW4obmFtZSAiLk9VVCIsICJ3Iiwgc3Rkb3V0KTsKICAgIH0KICAgIGJvb2wgdGVzdENhc2UgPSBmYWxzZTsKICAgIGludCBudW1UZXN0ID0gMTsKICAgIC8vIGNpbiA+PiBudW1UZXN0OwogICAgZm9ydyAoaSwgMSwgbnVtVGVzdCkgewogICAgICAgIGlmICh0ZXN0Q2FzZSkgY291dCA8PCAiQ2FzZSAjIiA8PCBpIDw8ICI6ICI7CiAgICAgICAgc29sdmUoKTsKICAgIH0KICAgIHJldHVybiAwOwp9Cg==