#include <bits/stdc++.h>
using namespace std;
const int M = 100005, N = 4 * M;
int n, q, k, pos, l, r;
string st;
char ch;
struct node {
  int chars['z' + 1];
  int count() {
    int c = 0;
    for (int i = 'a'; i <= 'z'; c += !(!chars[i++]))
      ;
    return c;
  }
  void clear() {
    for (int i = 'a'; i <= 'z'; chars[i++] = 0)
      ;
  }
  node() { clear(); }
};
node seg[N];
void init() {
  for (int i = 1; i <= 4 * n; seg[i++].clear())
    ;
}
node merge(node l, node r) {
  node x;
  for (int i = 'a'; i <= 'z'; i++) x.chars[i] = l.chars[i] + r.chars[i];
  return x;
}
void build(int i, int s, int e) {
  if (s == e) {
    seg[i].chars[st[s]]++;
    return;
  }
  build(i * 2, s, (s + e) / 2);
  build(i * 2 + 1, (s + e) / 2 + 1, e);
  seg[i] = merge(seg[i * 2], seg[i * 2 + 1]);
}
void update(int i, int s, int e) {
  if (s > pos || e < pos) return;
  if (s == e) {
    seg[i].chars[st[pos]]--;
    st[pos] = ch;
    seg[i].chars[st[pos]]++;
    return;
  }
  update(i * 2, s, (s + e) / 2);
  update(i * 2 + 1, (s + e) / 2 + 1, e);
  seg[i] = merge(seg[i * 2], seg[i * 2 + 1]);
}
node get(int i, int s, int e) {
  if (s > r || e < l) return node();
  if (s >= l && e <= r) return seg[i];
  return merge(get(i * 2, s, (s + e) / 2), get(i * 2 + 1, (s + e) / 2 + 1, e));
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cin >> st, n = st.size();
  build(1, 0, n - 1);
  cin >> q;
  while (q--) {
    cin >> k;
    if (k == 1) {
      cin >> pos >> ch, pos--;
      update(1, 0, n - 1);
    } else {
      cin >> l >> r, l--, r--;
      cout << get(1, 0, n - 1).count() << '\n';
    }
  }
  return 0;
}
