#include <bits/stdc++.h>
using namespace std;
//#define int long long
#define ll long long
#define P pair<int,int>
#define fi first
#define se second
#define rep(i,n) for(int i=0;i<n;i++)
#define all(v) v.begin(),v.end()
#define pb push_back
template<class T>void chmax(T& a, T b) { if (a < b)a = b; }
template<class T>void chmin(T& a, T b) { if (a > b)a = b; }
//constexpr int INF = 1000000000000000000;
constexpr int mod = 1000000007;
int dx[] = { 0,1,0,-1 }, dy[] = { 1,0,-1,0 };
int kaijo[2000010];
struct edge { int to, cost; };
int gcd(int a, int b) {
    if (b == 0)return a;
    return gcd(b, a % b);
}
int lcm(int a, int b) {
    return a / gcd(a, b) * b;
}
bool prime(int a) {
    if (a == 1)return false;
    for (int i = 2; i * i <= a; i++) {
        if (a % i == 0)return false;
    }
    return true;
}
void init_fact() {
    kaijo[0] = 1;
    for (int i = 1; i <= 2000000; i++) {
        kaijo[i] = kaijo[i - 1] * i;
        kaijo[i] %= mod;
    }
}
int modpow(int a, int b) {
    if (b == 0)return 1;
    if (b % 2)return modpow(a, b - 1) * a % mod;
    int memo = modpow(a, b / 2);
    return memo * memo % mod;
}
int comb(int a, int b) {
    if (!kaijo[0])init_fact();
    return kaijo[a] * modpow(kaijo[a - b], mod - 2) % mod * modpow(kaijo[b], mod - 2) % mod;
}
int inv(int x) {
    x = modpow(x, mod - 2);
    return x;
}
bool kosa(double ax, double ay, double bx, double by, double cx, double cy, double dx, double dy) {
    double ta = (cx - dx) * (ay - cy) + (cy - dy) * (cx - ax);
    double tb = (cx - dx) * (by - cy) + (cy - dy) * (cx - bx);
    double tc = (ax - bx) * (cy - ay) + (ay - by) * (ax - cx);
    double td = (ax - bx) * (dy - ay) + (ay - by) * (ax - dx);
    return tc * td < 0 && ta * tb < 0;
}
double dist(double ax, double ay, double bx, double by) {
    return sqrt((bx - ax) * (bx - ax) + (ay - by) * (ay - by));
}
int n, q, siz = 1;
vector<int>dat[26];
void init() {
    while (siz < n)siz *= 2;
    rep(i, 26)dat[i].resize(siz * 2 - 1, 0);
}
void update(int i, int k, int x) {
    k += (siz - 1);
    dat[i][k] += x;
    while (k > 0) {
        k = (k - 1) / 2;
        dat[i][k] = dat[i][2 * k + 1] + dat[i][2 * k + 2];
    }
}
int query(int i, int a, int b, int k = 0, int l = 0, int r = -1) {
    if (r == -1)r = siz;
    if (r <= a || b <= l)return 0;
    if (a <= l && r <= b)return dat[i][k];
    int vl = query(i, a, b, 2 * k + 1, l, (l + r) / 2);
    int vr = query(i, a, b, 2 * k + 2, (l + r) / 2, r);
    return vl + vr;
}
signed main() {
    int q;
    string s;
    cin >> n >> s >> q;
    init();
    rep(i, n) {
        int x = s[i] - 'a';
        update(x, i, 1);
    }
    while (q--) {
        int type;
        cin >> type;
        if (type == 1) {
            int i;
            char c;
            cin >> i >> c;
            i--;
            int f = s[i] - 'a', t = c - 'a';
            update(f, i, -1);
            update(t, i, 1);
            s[i] = c;
        }
        if (type == 2) {
            int l, r;
            cin >> l >> r;
            l--, r--;
            int res = 0;
            rep(i, 26) {
                if (query(i, l, r + 1))res++;
            }
            cout << res << endl;
        }
    }
    return 0;
}


Measured memory_bytes: 107524