#include <bits/stdc++.h>
//#define int long long
#define all(v) v.begin(),v.end()
using namespace std;
#define ll long long
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace __gnu_pbds;
template<class T>
using ordered_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
const int N = 1e6 + 10;
const long long md = 1e9 + 7;
const int Inf = 1e9;
struct queries{
int v, l, r, k;
char c, d;
int idx;
bool operator <(const queries& other){
return this->v < other.v;
}
};
struct update{
int i;
char x; int idx;
};
vector<ordered_set<int>> val(26);
pair<int, int> go_left (int l, int r, int k, char c){
if(val[c - 'a'].size() < k) return make_pair(-1, -1);
//cout << val[c - 'a'].size() << ' ' << k << endl;
auto left = val[c - 'a'].lower_bound(l);
if(left == val[c - 'a'].end() || *left > r){
return make_pair(-1, -1);
}
int out_range = val[c - 'a'].order_of_key(*left);
auto right = val[c - 'a'].upper_bound(r);
right--;
int in_range = val[c - 'a'].order_of_key(*right) + 1 - out_range;
// cout << *left << ' ' << *right << " " << r<< endl;
if(in_range < k) return make_pair(-1, -1);
right = val[c - 'a'].find_by_order(k + out_range - 1);
pair<int, int> ans;
ans.first = *right;
ans.second = *(++right) - 1;
return ans;
};
int go_right(int l, int r, int k, char c){
if(val[c - 'a'].size() < k) return -1;
auto right = val[c - 'a'].upper_bound(r);
auto left = val[c - 'a'].lower_bound(l);
if(left == val[c - 'a'].end() || *left > r){
return -1;
}
--right;
int w = val[c - 'a'].order_of_key(*right) + 1;
int in_range = w - val[c - 'a'].order_of_key(*left);
if(in_range < k) return -1;
--w;
auto right1 = val[c - 'a'].find_by_order(w + 1 - k);
return *right1;
};
void sol() {
string s; cin >> s;
int n = s.size(), q; cin >> q;
for (int i = 0; i < n; ++i) {
val[s[i] - 'a'].insert(i);
}
vector<queries> qt;
vector<update> upd;
for (int i = 0; i < q; ++i) {
int t; cin >> t;
if(t == 1){
int j; char k; cin >> j >> k;
upd.push_back({j - 1, k, i});
} else{
int v, l, r, k; cin >> v >> l >> r >> k; --l, --r;
char c, d; cin >> c >> d;
qt.push_back({v,l,r, k, c,d, i});
}
}
sort(all(qt));
vector<int> res(q, -1);
function<void(update)> go_upd = [&] (update curr){
val[s[curr.i] - 'a'].erase(curr.i);
s[curr.i] = curr.x;
val[s[curr.i] - 'a'].insert(curr.i);
};
for (int i = 0, j = 0; i < qt.size(); ++i) {
while(j < upd.size() && qt[i].v - 1 >= j){
go_upd(upd[j]);
++j;
}
auto [v, l, r, k, c,d, idx] = qt[i];
pair<int, int> left = go_left(l, r, k, c);
int right = go_right(l, r, k, d);
if(left.first == -1 || right == -1 || right <= left.first){
res[idx] = 0;
} else{
res[idx] = min(left.second - left.first + 1, right - left.first);
}
}
for (int i = 0; i < q; ++i) {
if(res[i] == -1) continue;
cout << res[i] << '\n';
}
}
signed main() {
ios::sync_with_stdio(0);
cin.tie(0);
int t = 1;
// cin >> t;
while (t--) {
sol();
}
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CgovLyNkZWZpbmUgIGludCBsb25nIGxvbmcKI2RlZmluZSAgYWxsKHYpIHYuYmVnaW4oKSx2LmVuZCgpCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CiNkZWZpbmUgbGwgbG9uZyBsb25nCgojaW5jbHVkZSA8ZXh0L3BiX2RzL2Fzc29jX2NvbnRhaW5lci5ocHA+CiNpbmNsdWRlIDxleHQvcGJfZHMvdHJlZV9wb2xpY3kuaHBwPgp1c2luZyBuYW1lc3BhY2UgX19nbnVfcGJkczsKdGVtcGxhdGU8Y2xhc3MgVD4KdXNpbmcgb3JkZXJlZF9zZXQgPSB0cmVlPFQsIG51bGxfdHlwZSwgbGVzczxUPiwgcmJfdHJlZV90YWcsIHRyZWVfb3JkZXJfc3RhdGlzdGljc19ub2RlX3VwZGF0ZT47Cgpjb25zdCBpbnQgTiA9IDFlNiArIDEwOwpjb25zdCBsb25nIGxvbmcgbWQgPSAxZTkgKyA3OwoKY29uc3QgaW50IEluZiA9IDFlOTsKc3RydWN0IHF1ZXJpZXN7CiAgICBpbnQgdiwgbCwgciwgazsKICAgIGNoYXIgYywgZDsKICAgIGludCBpZHg7CiAgICBib29sIG9wZXJhdG9yIDwoY29uc3QgcXVlcmllcyYgb3RoZXIpewogICAgICAgIHJldHVybiB0aGlzLT52IDwgb3RoZXIudjsKICAgIH0KfTsKc3RydWN0IHVwZGF0ZXsKICAgIGludCBpOwogICAgY2hhciB4OyBpbnQgaWR4Owp9Owp2ZWN0b3I8b3JkZXJlZF9zZXQ8aW50Pj4gdmFsKDI2KTsKcGFpcjxpbnQsIGludD4gZ29fbGVmdCAoaW50IGwsIGludCByLCBpbnQgaywgY2hhciBjKXsKICAgIGlmKHZhbFtjIC0gJ2EnXS5zaXplKCkgPCBrKSByZXR1cm4gbWFrZV9wYWlyKC0xLCAtMSk7CiAgICAvL2NvdXQgPDwgdmFsW2MgLSAnYSddLnNpemUoKSA8PCAnICcgPDwgayA8PCBlbmRsOwogICAgYXV0byBsZWZ0ID0gdmFsW2MgLSAnYSddLmxvd2VyX2JvdW5kKGwpOwogICAgaWYobGVmdCA9PSB2YWxbYyAtICdhJ10uZW5kKCkgfHwgKmxlZnQgPiByKXsKCiAgICAgICAgcmV0dXJuIG1ha2VfcGFpcigtMSwgLTEpOwogICAgfQoKICAgIGludCBvdXRfcmFuZ2UgPSB2YWxbYyAtICdhJ10ub3JkZXJfb2Zfa2V5KCpsZWZ0KTsKICAgIGF1dG8gcmlnaHQgPSB2YWxbYyAtICdhJ10udXBwZXJfYm91bmQocik7CiAgICByaWdodC0tOwogICAgaW50IGluX3JhbmdlID0gdmFsW2MgLSAnYSddLm9yZGVyX29mX2tleSgqcmlnaHQpICsgMSAtIG91dF9yYW5nZTsKICAgIC8vIGNvdXQgPDwgKmxlZnQgPDwgJyAnIDw8ICpyaWdodCA8PCAiICIgPDwgcjw8IGVuZGw7CiAgICBpZihpbl9yYW5nZSA8IGspIHJldHVybiBtYWtlX3BhaXIoLTEsIC0xKTsKCiAgICByaWdodCA9IHZhbFtjIC0gJ2EnXS5maW5kX2J5X29yZGVyKGsgKyBvdXRfcmFuZ2UgLSAxKTsKICAgIHBhaXI8aW50LCBpbnQ+IGFuczsKICAgIGFucy5maXJzdCA9ICpyaWdodDsKICAgIGFucy5zZWNvbmQgPSAqKCsrcmlnaHQpIC0gMTsKICAgIHJldHVybiBhbnM7Cn07CmludCBnb19yaWdodChpbnQgbCwgaW50IHIsIGludCBrLCBjaGFyIGMpewogICAgaWYodmFsW2MgLSAnYSddLnNpemUoKSA8IGspIHJldHVybiAtMTsKICAgIGF1dG8gcmlnaHQgPSB2YWxbYyAtICdhJ10udXBwZXJfYm91bmQocik7CiAgICBhdXRvIGxlZnQgPSB2YWxbYyAtICdhJ10ubG93ZXJfYm91bmQobCk7CiAgICBpZihsZWZ0ID09IHZhbFtjIC0gJ2EnXS5lbmQoKSB8fCAqbGVmdCA+IHIpewogICAgICAgIHJldHVybiAtMTsKICAgIH0KICAgIC0tcmlnaHQ7CiAgICBpbnQgdyA9IHZhbFtjIC0gJ2EnXS5vcmRlcl9vZl9rZXkoKnJpZ2h0KSArIDE7CiAgICBpbnQgaW5fcmFuZ2UgPSB3IC0gdmFsW2MgLSAnYSddLm9yZGVyX29mX2tleSgqbGVmdCk7CiAgICBpZihpbl9yYW5nZSA8IGspIHJldHVybiAtMTsKICAgIC0tdzsKICAgIGF1dG8gcmlnaHQxID0gdmFsW2MgLSAnYSddLmZpbmRfYnlfb3JkZXIodyArIDEgLSBrKTsKICAgIHJldHVybiAqcmlnaHQxOwp9Owp2b2lkIHNvbCgpIHsKICAgIHN0cmluZyBzOyBjaW4gPj4gczsKICAgIGludCBuID0gcy5zaXplKCksIHE7IGNpbiA+PiBxOwoKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgICAgdmFsW3NbaV0gLSAnYSddLmluc2VydChpKTsKICAgIH0KICAgIHZlY3RvcjxxdWVyaWVzPiBxdDsKICAgIHZlY3Rvcjx1cGRhdGU+IHVwZDsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcTsgKytpKSB7CiAgICAgICAgaW50IHQ7IGNpbiA+PiB0OwogICAgICAgIGlmKHQgPT0gMSl7CiAgICAgICAgICAgIGludCBqOyBjaGFyIGs7IGNpbiA+PiBqID4+IGs7CiAgICAgICAgICAgIHVwZC5wdXNoX2JhY2soe2ogLSAxLCBrLCBpfSk7CiAgICAgICAgfSBlbHNlewogICAgICAgICAgICBpbnQgdiwgbCwgciwgazsgY2luID4+IHYgPj4gbCA+PiByID4+IGs7IC0tbCwgLS1yOwogICAgICAgICAgICBjaGFyIGMsIGQ7IGNpbiA+PiBjID4+IGQ7CiAgICAgICAgICAgIHF0LnB1c2hfYmFjayh7dixsLHIsIGssIGMsZCwgaX0pOwogICAgICAgIH0KICAgIH0KICAgIHNvcnQoYWxsKHF0KSk7CiAgICB2ZWN0b3I8aW50PiByZXMocSwgLTEpOwogICAgZnVuY3Rpb248dm9pZCh1cGRhdGUpPiBnb191cGQgPSBbJl0gKHVwZGF0ZSBjdXJyKXsKICAgICAgICB2YWxbc1tjdXJyLmldIC0gJ2EnXS5lcmFzZShjdXJyLmkpOwogICAgICAgIHNbY3Vyci5pXSA9IGN1cnIueDsKICAgICAgICB2YWxbc1tjdXJyLmldIC0gJ2EnXS5pbnNlcnQoY3Vyci5pKTsKICAgIH07CgoKICAgIGZvciAoaW50IGkgPSAwLCBqID0gMDsgaSA8IHF0LnNpemUoKTsgKytpKSB7CiAgICAgICAgd2hpbGUoaiA8IHVwZC5zaXplKCkgJiYgcXRbaV0udiAtIDEgPj0gail7CiAgICAgICAgICAgIGdvX3VwZCh1cGRbal0pOwogICAgICAgICAgICArK2o7CiAgICAgICAgfQogICAgICAgIGF1dG8gW3YsIGwsIHIsIGssIGMsZCwgaWR4XSA9IHF0W2ldOwogICAgICAgIHBhaXI8aW50LCBpbnQ+IGxlZnQgPSBnb19sZWZ0KGwsIHIsIGssIGMpOwogICAgICAgIGludCByaWdodCA9IGdvX3JpZ2h0KGwsIHIsIGssIGQpOwogICAgICAgIGlmKGxlZnQuZmlyc3QgPT0gLTEgfHwgcmlnaHQgPT0gLTEgfHwgcmlnaHQgPD0gbGVmdC5maXJzdCl7CiAgICAgICAgICAgIHJlc1tpZHhdID0gMDsKICAgICAgICB9IGVsc2V7CiAgICAgICAgICAgIHJlc1tpZHhdID0gIG1pbihsZWZ0LnNlY29uZCAtIGxlZnQuZmlyc3QgKyAxLCByaWdodCAtIGxlZnQuZmlyc3QpOwogICAgICAgIH0KICAgIH0KCiAgICBmb3IgKGludCBpID0gMDsgaSA8IHE7ICsraSkgewogICAgICAgIGlmKHJlc1tpXSA9PSAtMSkgY29udGludWU7CiAgICAgICAgY291dCA8PCByZXNbaV0gPDwgJ1xuJzsKICAgIH0KCn0Kc2lnbmVkIG1haW4oKSB7CgogICAgaW9zOjpzeW5jX3dpdGhfc3RkaW8oMCk7CiAgICBjaW4udGllKDApOwogICAgaW50IHQgPSAxOwovLyAgICBjaW4gPj4gdDsKICAgIHdoaWxlICh0LS0pIHsKICAgICAgICBzb2woKTsKICAgIH0KCn0=