#include <bits/stdc++.h>
#define ll long long
#define int ll
#define db long double
#define sz(s) (int)s.size()
#define all(v) v.begin(),v.end()
#define rall(v) v.rbegin(),v.rend()
#define pb push_back
#define fi first
#define se second
#define vi vector<int>
#define vvi vector<vector<int>>
#define vvd vector<vector<db>>
#define vpi vector<pair<int,int>>
#define ii pair<ll,ll>
#define fix(n, num) fixed<<setprecision(num)<<n
using namespace std;
mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count());
const int N = 20 + 5, mod = 1e9 + 7;
const ll inf = 1e18;
struct node {
int val[26] = {};
node(int x = 26) {
if (x < 26)
val[x]++;
}
void change(int x) {
for (int i = 0; i < 26; ++i) {
val[i] = 0;
}
val[x]++;
}
};
struct segtree {
int tree_size;
vector<node> seg_data;
segtree(int n) {
tree_size = 1;
while (tree_size < n) tree_size *= 2;
seg_data.assign(2 * tree_size, node());
}
void merge(node &ret, const node &lf, const node &ri) {
for (int i = 0; i < 26; ++i) {
ret.val[i] = lf.val[i] + ri.val[i];
}
}
int sum(int l, int r, int c, int ni, int lx, int rx) {
if (lx >= r || rx <= l)
return 0;
if (lx >= l && rx <= r)
return seg_data[ni].val[c];
int mid = (lx + rx) / 2;
return sum(l, r, c, 2 * ni + 1, lx, mid) + sum(l, r, c, 2 * ni + 2, mid, rx);
}
int sum(int l, int r, int c) {
if (r < l) return 0;
return sum(l, r + 1, c, 0, 0, tree_size);
}
int pre(int l, int r, int k, int c, int ni, int lx, int rx) {
if (rx - lx == 1) return lx;
int lf = seg_data[2 * ni + 1].val[c] - sum(lx, l - 1, c);
int mid = (lx + rx) / 2;
if (lf >= k)
return pre(l, r, k, c, 2 * ni + 1, lx, mid);
return pre(l, r, k - max(lf, 0ll), c, 2 * ni + 2, mid, rx);
}
int pre(int l, int r, int k, int c) {
return pre(l, r + 1, k, c, 0, 0, tree_size);
}
int suf(int l, int r, int k, int c, int ni, int lx, int rx) {
if (rx - lx == 1) return lx;
int ri = seg_data[2 * ni + 2].val[c] - sum(r + 1, rx - 1, c);
int mid = (lx + rx) / 2;
if (ri >= k)
return suf(l, r, k, c, 2 * ni + 2, mid, rx);
return suf(l, r, k - max(ri, 0ll), c, 2 * ni + 1, lx, mid);
}
int suf(int l, int r, int k, int c) {
return suf(l, r + 1, k, c, 0, 0, tree_size);
}
void change(int idx, int val, int ni, int lx, int rx) {
if (rx - lx == 1) {
seg_data[ni].change(val);
return;
}
ll mid = (lx + rx) / 2;
if (idx < mid)
change(idx, val, 2 * ni + 1, lx, mid);
else
change(idx, val, 2 * ni + 2, mid, rx);
merge(seg_data[ni], seg_data[2 * ni + 1], seg_data[2 * ni + 2]);
}
void change(int idx, int val) {
change(idx, val, 0, 0, tree_size);
}
};
struct query {
int l, r, k, c, d, idx;
};
void here_we_go_again() {
string s;
cin >> s;
int n = sz(s);
s = ' ' + s;
segtree t(n + 1);
for (int i = 1; i <= n; ++i) {
t.change(i, s[i] - 'a');
}
int id = 0, up = 0, num;
cin >> num;
vector<query> q[num];
ii ver[num];
while (num--) {
int t;
cin >> t;
if (t == 1) {
int i;
char x;
cin >> i >> x;
ver[++up] = {i, x - 'a'};
} else {
int v, l, r, k;
char c, d;
cin >> v >> l >> r >> k >> c >> d;
q[v].pb({l, r, k, c - 'a', d - 'a', id++});
}
}
vi ans(id);
for (int v = 0; v <= up; ++v) {
if (v)
t.change(ver[v].fi, ver[v].se);
// l1 -> pre Kth c r1 -> pre (k+1)th c
// l2 -> start r2 -> suf kth d
for (auto &[l, r, k, c, d, idx]: q[v]) {
int pre = t.sum(l, r, c);
if (pre < k || t.sum(l, r, d) < k)
continue;
int l1 = t.pre(l, r, k, c);
int r1 = (pre > k ? t.pre(l, r, k + 1, c) : r);
int l2 = l, r2 = t.suf(l, r, k, d);
ans[idx] = max(0ll, min(r1, r2) - max(l1, l2));
}
}
for (auto &i: ans)
cout << i << '\n';
}
int32_t main() {
// freopen("points.in", "r", stdin);
// freopen("output.txt", "w", stdout);
ios_base::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
int t = 1;
// cin >> t;
for (int i = 1; i <= t; ++i) {
// cout<<"Case #"<<i<<": ";
here_we_go_again();
}
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CgojZGVmaW5lIGxsIGxvbmcgbG9uZwojZGVmaW5lIGludCBsbAojZGVmaW5lIGRiIGxvbmcgZG91YmxlCiNkZWZpbmUgc3oocykgKGludClzLnNpemUoKQojZGVmaW5lIGFsbCh2KSB2LmJlZ2luKCksdi5lbmQoKQojZGVmaW5lIHJhbGwodikgdi5yYmVnaW4oKSx2LnJlbmQoKQojZGVmaW5lIHBiIHB1c2hfYmFjawojZGVmaW5lIGZpIGZpcnN0CiNkZWZpbmUgc2Ugc2Vjb25kCiNkZWZpbmUgdmkgdmVjdG9yPGludD4KI2RlZmluZSB2dmkgdmVjdG9yPHZlY3RvcjxpbnQ+PgojZGVmaW5lIHZ2ZCB2ZWN0b3I8dmVjdG9yPGRiPj4KI2RlZmluZSB2cGkgdmVjdG9yPHBhaXI8aW50LGludD4+CiNkZWZpbmUgaWkgcGFpcjxsbCxsbD4KI2RlZmluZSBmaXgobiwgbnVtKSBmaXhlZDw8c2V0cHJlY2lzaW9uKG51bSk8PG4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKbXQxOTkzN182NCBybmcoY2hyb25vOjpzdGVhZHlfY2xvY2s6Om5vdygpLnRpbWVfc2luY2VfZXBvY2goKS5jb3VudCgpKTsKY29uc3QgaW50IE4gPSAyMCArIDUsIG1vZCA9IDFlOSArIDc7CmNvbnN0IGxsIGluZiA9IDFlMTg7CgpzdHJ1Y3Qgbm9kZSB7CiAgICBpbnQgdmFsWzI2XSA9IHt9OwoKICAgIG5vZGUoaW50IHggPSAyNikgewogICAgICAgIGlmICh4IDwgMjYpCiAgICAgICAgICAgIHZhbFt4XSsrOwogICAgfQoKICAgIHZvaWQgY2hhbmdlKGludCB4KSB7CiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyNjsgKytpKSB7CiAgICAgICAgICAgIHZhbFtpXSA9IDA7CiAgICAgICAgfQogICAgICAgIHZhbFt4XSsrOwogICAgfQp9OwoKc3RydWN0IHNlZ3RyZWUgewogICAgaW50IHRyZWVfc2l6ZTsKICAgIHZlY3Rvcjxub2RlPiBzZWdfZGF0YTsKCiAgICBzZWd0cmVlKGludCBuKSB7CiAgICAgICAgdHJlZV9zaXplID0gMTsKICAgICAgICB3aGlsZSAodHJlZV9zaXplIDwgbikgdHJlZV9zaXplICo9IDI7CiAgICAgICAgc2VnX2RhdGEuYXNzaWduKDIgKiB0cmVlX3NpemUsIG5vZGUoKSk7CiAgICB9CgogICAgdm9pZCBtZXJnZShub2RlICZyZXQsIGNvbnN0IG5vZGUgJmxmLCBjb25zdCBub2RlICZyaSkgewogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjY7ICsraSkgewogICAgICAgICAgICByZXQudmFsW2ldID0gbGYudmFsW2ldICsgcmkudmFsW2ldOwogICAgICAgIH0KICAgIH0KCiAgICBpbnQgc3VtKGludCBsLCBpbnQgciwgaW50IGMsIGludCBuaSwgaW50IGx4LCBpbnQgcngpIHsKICAgICAgICBpZiAobHggPj0gciB8fCByeCA8PSBsKQogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICBpZiAobHggPj0gbCAmJiByeCA8PSByKQogICAgICAgICAgICByZXR1cm4gc2VnX2RhdGFbbmldLnZhbFtjXTsKICAgICAgICBpbnQgbWlkID0gKGx4ICsgcngpIC8gMjsKICAgICAgICByZXR1cm4gc3VtKGwsIHIsIGMsIDIgKiBuaSArIDEsIGx4LCBtaWQpICsgc3VtKGwsIHIsIGMsIDIgKiBuaSArIDIsIG1pZCwgcngpOwogICAgfQoKICAgIGludCBzdW0oaW50IGwsIGludCByLCBpbnQgYykgewogICAgICAgIGlmIChyIDwgbCkgcmV0dXJuIDA7CiAgICAgICAgcmV0dXJuIHN1bShsLCByICsgMSwgYywgMCwgMCwgdHJlZV9zaXplKTsKICAgIH0KCiAgICBpbnQgcHJlKGludCBsLCBpbnQgciwgaW50IGssIGludCBjLCBpbnQgbmksIGludCBseCwgaW50IHJ4KSB7CiAgICAgICAgaWYgKHJ4IC0gbHggPT0gMSkgcmV0dXJuIGx4OwoKICAgICAgICBpbnQgbGYgPSBzZWdfZGF0YVsyICogbmkgKyAxXS52YWxbY10gLSBzdW0obHgsIGwgLSAxLCBjKTsKICAgICAgICBpbnQgbWlkID0gKGx4ICsgcngpIC8gMjsKICAgICAgICBpZiAobGYgPj0gaykKICAgICAgICAgICAgcmV0dXJuIHByZShsLCByLCBrLCBjLCAyICogbmkgKyAxLCBseCwgbWlkKTsKICAgICAgICByZXR1cm4gcHJlKGwsIHIsIGsgLSBtYXgobGYsIDBsbCksIGMsIDIgKiBuaSArIDIsIG1pZCwgcngpOwogICAgfQoKICAgIGludCBwcmUoaW50IGwsIGludCByLCBpbnQgaywgaW50IGMpIHsKICAgICAgICByZXR1cm4gcHJlKGwsIHIgKyAxLCBrLCBjLCAwLCAwLCB0cmVlX3NpemUpOwogICAgfQoKICAgIGludCBzdWYoaW50IGwsIGludCByLCBpbnQgaywgaW50IGMsIGludCBuaSwgaW50IGx4LCBpbnQgcngpIHsKICAgICAgICBpZiAocnggLSBseCA9PSAxKSByZXR1cm4gbHg7CgogICAgICAgIGludCByaSA9IHNlZ19kYXRhWzIgKiBuaSArIDJdLnZhbFtjXSAtIHN1bShyICsgMSwgcnggLSAxLCBjKTsKICAgICAgICBpbnQgbWlkID0gKGx4ICsgcngpIC8gMjsKICAgICAgICBpZiAocmkgPj0gaykKICAgICAgICAgICAgcmV0dXJuIHN1ZihsLCByLCBrLCBjLCAyICogbmkgKyAyLCBtaWQsIHJ4KTsKICAgICAgICByZXR1cm4gc3VmKGwsIHIsIGsgLSBtYXgocmksIDBsbCksIGMsIDIgKiBuaSArIDEsIGx4LCBtaWQpOwogICAgfQoKICAgIGludCBzdWYoaW50IGwsIGludCByLCBpbnQgaywgaW50IGMpIHsKICAgICAgICByZXR1cm4gc3VmKGwsIHIgKyAxLCBrLCBjLCAwLCAwLCB0cmVlX3NpemUpOwogICAgfQoKICAgIHZvaWQgY2hhbmdlKGludCBpZHgsIGludCB2YWwsIGludCBuaSwgaW50IGx4LCBpbnQgcngpIHsKICAgICAgICBpZiAocnggLSBseCA9PSAxKSB7CiAgICAgICAgICAgIHNlZ19kYXRhW25pXS5jaGFuZ2UodmFsKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBsbCBtaWQgPSAobHggKyByeCkgLyAyOwoKICAgICAgICBpZiAoaWR4IDwgbWlkKQogICAgICAgICAgICBjaGFuZ2UoaWR4LCB2YWwsIDIgKiBuaSArIDEsIGx4LCBtaWQpOwogICAgICAgIGVsc2UKICAgICAgICAgICAgY2hhbmdlKGlkeCwgdmFsLCAyICogbmkgKyAyLCBtaWQsIHJ4KTsKCiAgICAgICAgbWVyZ2Uoc2VnX2RhdGFbbmldLCBzZWdfZGF0YVsyICogbmkgKyAxXSwgc2VnX2RhdGFbMiAqIG5pICsgMl0pOwogICAgfQoKICAgIHZvaWQgY2hhbmdlKGludCBpZHgsIGludCB2YWwpIHsKICAgICAgICBjaGFuZ2UoaWR4LCB2YWwsIDAsIDAsIHRyZWVfc2l6ZSk7CiAgICB9Cgp9OwoKc3RydWN0IHF1ZXJ5IHsKICAgIGludCBsLCByLCBrLCBjLCBkLCBpZHg7Cn07Cgp2b2lkIGhlcmVfd2VfZ29fYWdhaW4oKSB7CiAgICBzdHJpbmcgczsKICAgIGNpbiA+PiBzOwoKICAgIGludCBuID0gc3oocyk7CiAgICBzID0gJyAnICsgczsKICAgIHNlZ3RyZWUgdChuICsgMSk7CiAgICBmb3IgKGludCBpID0gMTsgaSA8PSBuOyArK2kpIHsKICAgICAgICB0LmNoYW5nZShpLCBzW2ldIC0gJ2EnKTsKICAgIH0KCiAgICBpbnQgaWQgPSAwLCB1cCA9IDAsIG51bTsKICAgIGNpbiA+PiBudW07CiAgICB2ZWN0b3I8cXVlcnk+IHFbbnVtXTsKICAgIGlpIHZlcltudW1dOwogICAgd2hpbGUgKG51bS0tKSB7CiAgICAgICAgaW50IHQ7CiAgICAgICAgY2luID4+IHQ7CiAgICAgICAgaWYgKHQgPT0gMSkgewogICAgICAgICAgICBpbnQgaTsKICAgICAgICAgICAgY2hhciB4OwogICAgICAgICAgICBjaW4gPj4gaSA+PiB4OwogICAgICAgICAgICB2ZXJbKyt1cF0gPSB7aSwgeCAtICdhJ307CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaW50IHYsIGwsIHIsIGs7CiAgICAgICAgICAgIGNoYXIgYywgZDsKICAgICAgICAgICAgY2luID4+IHYgPj4gbCA+PiByID4+IGsgPj4gYyA+PiBkOwogICAgICAgICAgICBxW3ZdLnBiKHtsLCByLCBrLCBjIC0gJ2EnLCBkIC0gJ2EnLCBpZCsrfSk7CiAgICAgICAgfQogICAgfQoKICAgIHZpIGFucyhpZCk7CgogICAgZm9yIChpbnQgdiA9IDA7IHYgPD0gdXA7ICsrdikgewogICAgICAgIGlmICh2KQogICAgICAgICAgICB0LmNoYW5nZSh2ZXJbdl0uZmksIHZlclt2XS5zZSk7CgogICAgICAgIC8vIGwxIC0+IHByZSBLdGggYyAgIHIxIC0+IHByZSAoaysxKXRoIGMKICAgICAgICAvLyBsMiAtPiBzdGFydCAgICAgICByMiAtPiBzdWYga3RoIGQKCiAgICAgICAgZm9yIChhdXRvICZbbCwgciwgaywgYywgZCwgaWR4XTogcVt2XSkgewogICAgICAgICAgICBpbnQgcHJlID0gdC5zdW0obCwgciwgYyk7CiAgICAgICAgICAgIGlmIChwcmUgPCBrIHx8IHQuc3VtKGwsIHIsIGQpIDwgaykKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICBpbnQgbDEgPSB0LnByZShsLCByLCBrLCBjKTsKICAgICAgICAgICAgaW50IHIxID0gKHByZSA+IGsgPyB0LnByZShsLCByLCBrICsgMSwgYykgOiByKTsKICAgICAgICAgICAgaW50IGwyID0gbCwgcjIgPSB0LnN1ZihsLCByLCBrLCBkKTsKICAgICAgICAgICAgYW5zW2lkeF0gPSBtYXgoMGxsLCBtaW4ocjEsIHIyKSAtIG1heChsMSwgbDIpKTsKICAgICAgICB9CgogICAgfQoKICAgIGZvciAoYXV0byAmaTogYW5zKQogICAgICAgIGNvdXQgPDwgaSA8PCAnXG4nOwoKCn0KCmludDMyX3QgbWFpbigpIHsKLy8gICAgZnJlb3BlbigicG9pbnRzLmluIiwgInIiLCBzdGRpbik7Ci8vICAgIGZyZW9wZW4oIm91dHB1dC50eHQiLCAidyIsIHN0ZG91dCk7CiAgICBpb3NfYmFzZTo6c3luY193aXRoX3N0ZGlvKGZhbHNlKTsKICAgIGNpbi50aWUoMCksIGNvdXQudGllKDApOwoKICAgIGludCB0ID0gMTsKLy8gICAgY2luID4+IHQ7CiAgICBmb3IgKGludCBpID0gMTsgaSA8PSB0OyArK2kpIHsKICAgICAgICAvLyAgY291dDw8IkNhc2UgIyI8PGk8PCI6ICI7CiAgICAgICAgaGVyZV93ZV9nb19hZ2FpbigpOwogICAgfQoKICAgIHJldHVybiAwOwp9Cg==