#include <bits/stdc++.h>
using namespace std;
int main() {
string s;
cin >> s;
int q;
cin >> q;
s = " " + s;
int n = s.size() - 1;
vector<vector<int>> queries(q, vector<int>(3, 0));
for (int i = 0; i < q; i++) {
cin >> queries[i][0] >> queries[i][1] >> queries[i][2];
}
unordered_map<char, set<int>> mp;
for (int i = 1; i <= n; i++) {
mp[s[i]].insert(i);
}
for (int i = 0; i < q; i++) {
int id = queries[i][0];
if (id == 1) {
int idx = queries[i][1];
char old_char = s[idx];
char new_char = 'a' + queries[i][2] - 1;
mp[old_char].erase(idx);
s[idx] = new_char;
mp[new_char].insert(idx);
cout << s.substr(1) << " "; // skip dummy char
} else {
int l = queries[i][1];
int r = queries[i][2];
int count = 0;
for (char c = 'a'; c <= 'z'; c++) {
auto it = mp[c].upper_bound(r);
if (it != mp[c].begin()) {
--it;
if (*it >= l) count++;
}
}
cout << count << " ";
}
}
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgppbnQgbWFpbigpIHsKICAgIHN0cmluZyBzOwogICAgY2luID4+IHM7CiAgICBpbnQgcTsKICAgIGNpbiA+PiBxOwoKICAgIHMgPSAiICIgKyBzOwogICAgaW50IG4gPSBzLnNpemUoKSAtIDE7CgogICAgdmVjdG9yPHZlY3RvcjxpbnQ+PiBxdWVyaWVzKHEsIHZlY3RvcjxpbnQ+KDMsIDApKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcTsgaSsrKSB7CiAgICAgICAgY2luID4+IHF1ZXJpZXNbaV1bMF0gPj4gcXVlcmllc1tpXVsxXSA+PiBxdWVyaWVzW2ldWzJdOwogICAgfQoKICAgIHVub3JkZXJlZF9tYXA8Y2hhciwgc2V0PGludD4+IG1wOwogICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gbjsgaSsrKSB7CiAgICAgICAgbXBbc1tpXV0uaW5zZXJ0KGkpOwogICAgfQoKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcTsgaSsrKSB7CiAgICAgICAgaW50IGlkID0gcXVlcmllc1tpXVswXTsKCiAgICAgICAgaWYgKGlkID09IDEpIHsKICAgICAgICAgICAgaW50IGlkeCA9IHF1ZXJpZXNbaV1bMV07CiAgICAgICAgICAgIGNoYXIgb2xkX2NoYXIgPSBzW2lkeF07CiAgICAgICAgICAgIGNoYXIgbmV3X2NoYXIgPSAnYScgKyBxdWVyaWVzW2ldWzJdIC0gMTsKCiAgICAgICAgICAgIG1wW29sZF9jaGFyXS5lcmFzZShpZHgpOwogICAgICAgICAgICBzW2lkeF0gPSBuZXdfY2hhcjsKICAgICAgICAgICAgbXBbbmV3X2NoYXJdLmluc2VydChpZHgpOwoKICAgICAgICAgICAgY291dCA8PCBzLnN1YnN0cigxKSA8PCAiICI7ICAvLyBza2lwIGR1bW15IGNoYXIKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpbnQgbCA9IHF1ZXJpZXNbaV1bMV07CiAgICAgICAgICAgIGludCByID0gcXVlcmllc1tpXVsyXTsKICAgICAgICAgICAgaW50IGNvdW50ID0gMDsKCiAgICAgICAgICAgIGZvciAoY2hhciBjID0gJ2EnOyBjIDw9ICd6JzsgYysrKSB7CiAgICAgICAgICAgICAgICBhdXRvIGl0ID0gbXBbY10udXBwZXJfYm91bmQocik7CiAgICAgICAgICAgICAgICBpZiAoaXQgIT0gbXBbY10uYmVnaW4oKSkgewogICAgICAgICAgICAgICAgICAgIC0taXQ7CiAgICAgICAgICAgICAgICAgICAgaWYgKCppdCA+PSBsKSBjb3VudCsrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBjb3V0IDw8IGNvdW50IDw8ICIgIjsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIDA7Cn0K