
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int mod = 1e9 + 7, hf = 5e8 + 4;
int n, m, a[400001], od[400001], ev[400001], od2[400001], ev2[400001];
bool fl = false; char str[400002];
int lowbit(int x) {
return x & -x;
}
void add(int p, int k, int c[]) {
while (p <= n)
(c[p] += k) %= mod, p += lowbit(p);
}
int sum(int p,int c[]) {
int res = 0;
while (p)
(res += c[p]) %= mod, p -= lowbit(p);
return res;
}
int sum(int p, int c, int c1[], int c2[]) {
return (c % mod * sum(p, c1) % mod + sum(p, c2)) % mod;
}
void modify(int p,int k) {
if (p & 1)
add(p, k - a[p], od), add(p, (a[p] - k) * (p - 1), od2);
else
add(p, k - a[p], ev), add(p, (a[p] - k) * (p - 2), ev2);
a[p] = k;
}
int calc(int l, int r) {
int len = r - l + 1;
if (l & 1)
return (sum(r, len + l - 1, od, od2) - sum(l - 1, len + l - 1, od, od2)) % mod;
else
return (sum(r, len + l - 2, ev, ev2) - sum(l - 1, len + l - 2, ev, ev2)) % mod;
}
int calcL(int l, int len) {
if (l & 1)
return (sum(n, len + l - 1, od, od2) - sum(l - 1, len + l - 1, od, od2)) % mod;
else
return (sum(n, len + l - 2, ev, ev2) - sum(l - 1, len + l - 2, ev, ev2)) % mod;
}
int calcR(int l, int r, int len, int dep) {
if (l & 1) {
len = (len + l - 1 - dep % mod * n % mod) % mod;
return sum(r - n * dep, len, od, od2);
} else {
len = (len + l - 2 - dep % mod * n % mod) % mod;
return sum(r - n * dep, len, ev, ev2);
}
}
int calcM(int l, int len, int m) {
int a, b; len %= mod, m %= mod;
if (l & 1) {
a = sum(n, od), b = sum(n, od2);
return (b * m % mod + (len + l - 1) % mod * a % mod * m % mod - a * n % mod * m % mod * (m + 1) % mod * hf % mod) % mod;
} else {
a = sum(n, ev), b = sum(n, ev2);
return (b * m % mod + (len + l - 2) % mod * a % mod * m % mod - a * n % mod * m % mod * (m + 1) % mod * hf % mod) % mod;
}
}
int query(int l, int r) {
int ans = 0, len = r - l + 1;
if (l > n)
r -= n * ((l - 1) / n), l -= n * ((l - 1) / n);
if (fl && l > n / 2)
l -= n / 2, r -= n / 2;
if (r <= n) ans = calc(l,r);
else {
ans = calcL(l, len);
if (r <= n * 2)
(ans += calcR(l, r, len, 1)) %= mod;
else
(ans += calcR(l, r, len, (r - 1) / n)) %= mod, (ans += calcM(l, len, (r - 1) / n - 1)) %= mod;
} return (ans + mod) % mod;
}
signed main() {
cin >> n >> (str + 1);
for (int i = 1; i <= n; i++)
a[i] = str[i] - '0';
if (n & 1) {
for (int i = 1; i <= n; i++) a[i + n] = a[i];
fl = true; n <<= 1;
} for (int i = 1; i <= n; i++)
if (i & 1)
add(i, a[i], od), add(i, -a[i] * (i - 1), od2);
else
add(i, a[i], ev), add(i, -a[i] * (i - 2), ev2);
cin >> m;
while (m--) {
int op, l, r; cin >> op >> l >> r;
if (op == 1) {
modify(l, r);
if (fl) modify(l, r);
} else
cout << query(l, r) << '\n';
} return 0;
}