import sys
import math
from decimal import Decimal, ROUND_HALF_UP, ROUND_HALF_EVEN
from collections import deque
from bisect import bisect_left
from itertools import product
def I(): return int(sys.stdin.readline())
def MI(): return map(int, sys.stdin.readline().split())
def LI(): return list(map(int, sys.stdin.readline().split()))
def LI2(N): return [list(map(int, sys.stdin.readline().split())) for i in range(N)]
#文字列を一文字ずつ数字に変換、'5678'を[5,6,7,8]とできる
def LSI(): return list(map(int, list(sys.stdin.readline().rstrip())))
def LSI2(N): return [list(map(int, list(sys.stdin.readline().rstrip()))) for i in range(N)]
#文字列として取得
def ST(): return sys.stdin.readline().rstrip()
def LST(): return sys.stdin.readline().rstrip().split()
def LST2(N): return [sys.stdin.readline().rstrip().split() for i in range(N)]
def FILL(i,h): return [i for j in range(h)]
def FILL2(i,h,w): return [FILL(i,w) for j in range(h)]
def FILL3(i,h,w,d): return [FILL2(i,w,d) for j in range(h)]
def FILL4(i,h,w,d,d2): return [FILL3(i,w,d,d2) for j in range(h)]
def sisha(num,digit): return Decimal(str(num)).quantize(Decimal(digit),rounding=ROUND_HALF_UP)
#'0.01'や'1E1'などで指定、整数に戻すならintをかます
MOD = 1000000007
INF = float("inf")
sys.setrecursionlimit(10**6+10)

N = I()
S = list(ST())
Q = I()
bits=[[0]*(N+1) for _ in range(26)]

def ctoi(c): #アルファベットを0-25の数字に変換
    return ord(c)-97

def query(pos): #各文字について1-pos番目までの文字数をカウント
    ret = [0]*26
    for i in range(26):
        tmp = 0
        p = pos
        while p>0:
            tmp += bits[i][p]
            bit_len = p&(-p) #p&(-p)は1のたつ最小桁であり、今の区間の長さをあらわす
            p -= bit_len #つぎに足すべき塊の番号は、今の値から区間の長さを引くとでる
        ret[i] = tmp #アルファベットiの1-posまでの出現回数
    return ret

def update(pos, a, x): #a番目のアルファベットについてpos番目の要素の値を更新
    while pos <= N:
        bits[a][pos] += x
        pos += pos&(-pos)

for i in range(N):
    update(i+1, ctoi(S[i]),1)
for _ in range(Q):
    q = LST()
    if q[0]=='1':
        i = int(q[1])
        c = q[2]
        if S[i-1]==c:
            continue
        update(i, ctoi(S[i-1]), -1) #S[i-1]のi番目に1が立っているが、これを下ろして削除を表現
        #O(logN)で削除が完了
        update(i, ctoi(c), 1)
        S[i-1] = c
    else:
        ans = 0
        l = int(q[1])
        r = int(q[2])
        r_sum = query(r)
        l_sum = query(l-1)
        for i in range(26):
            if r_sum[i]-l_sum[i] > 0:
                ans += 1
        print(ans) import sys sys import math math from decimal import Decimal, ROUND_HALF_UP, ROUND_HALF_EVEN from collections import deque from bisect import bisect_left from itertools import product def I(): return int(sys.stdin.readline()) I def MI(): return map(int, sys.stdin.readline().split()) MI def LI(): return list(map(int, sys.stdin.readline().split())) LI list(map(int, sys.stdin.readline().split())) for i in range(N) for i in range(N) i range(N) range N for i in range(N) list(map(int, sys.stdin.readline().split())) list map(int, sys.stdin.readline().split()) map int sys.stdin.readline().split() sys.stdin.readline().split sys.stdin.readline() sys.stdin.readline sys.stdin sys stdin readline split def LI2(N): return [list(map(int, sys.stdin.readline().split())) for i in range(N)]
#文字列を一文字ずつ数字に変換、'5678'を[5,6,7,8]とできる LI2 N N def LSI(): return list(map(int, list(sys.stdin.readline().rstrip()))) LSI list(map(int, list(sys.stdin.readline().rstrip()))) for i in range(N) for i in range(N) i range(N) range N for i in range(N) list(map(int, list(sys.stdin.readline().rstrip()))) list map(int, list(sys.stdin.readline().rstrip())) map int list(sys.stdin.readline().rstrip()) list sys.stdin.readline().rstrip() sys.stdin.readline().rstrip sys.stdin.readline() sys.stdin.readline sys.stdin sys stdin readline rstrip def LSI2(N): return [list(map(int, list(sys.stdin.readline().rstrip()))) for i in range(N)]
#文字列として取得 LSI2 N N def ST(): return sys.stdin.readline().rstrip() ST def LST(): return sys.stdin.readline().rstrip().split() LST sys.stdin.readline().rstrip().split() for i in range(N) for i in range(N) i range(N) range N for i in range(N) sys.stdin.readline().rstrip().split() sys.stdin.readline().rstrip().split sys.stdin.readline().rstrip() sys.stdin.readline().rstrip sys.stdin.readline() sys.stdin.readline sys.stdin sys stdin readline rstrip split def LST2(N): return [sys.stdin.readline().rstrip().split() for i in range(N)] LST2 N N i for j in range(h) for j in range(h) j range(h) range h for j in range(h) i def FILL(i,h): return [i for j in range(h)] FILL i i h h FILL(i,w) for j in range(h) for j in range(h) j range(h) range h for j in range(h) FILL(i,w) FILL i w def FILL2(i,h,w): return [FILL(i,w) for j in range(h)] FILL2 i i h h w w FILL2(i,w,d) for j in range(h) for j in range(h) j range(h) range h for j in range(h) FILL2(i,w,d) FILL2 i w d def FILL3(i,h,w,d): return [FILL2(i,w,d) for j in range(h)] FILL3 i i h h w w d d FILL3(i,w,d,d2) for j in range(h) for j in range(h) j range(h) range h for j in range(h) FILL3(i,w,d,d2) FILL3 i w d d2 def FILL4(i,h,w,d,d2): return [FILL3(i,w,d,d2) for j in range(h)] FILL4 i i h h w w d d d2 d2 def sisha(num,digit): return Decimal(str(num)).quantize(Decimal(digit),rounding=ROUND_HALF_UP)
#'0.01'や'1E1'などで指定、整数に戻すならintをかます sisha num num digit digit MOD = 1000000007 MOD 1000000007 INF = float("inf") INF float("inf") float "inf" sys.setrecursionlimit(10**6+10) sys.setrecursionlimit sys setrecursionlimit 10**6+10 10**6 10 6 10 N = I() N I() I S = list(ST()) S list(ST()) list ST() ST Q = I() Q I() I [0]*(N+1) for _ in range(26) for _ in range(26) _ range(26) range 26 for _ in range(26) [0]*(N+1) [0] 0 N+1 N 1 bits=[[0]*(N+1) for _ in range(26)] bits [[0]*(N+1) for _ in range(26)] def ctoi(c): #アルファベットを0-25の数字に変換
    return ord(c)-97 ctoi return ord(c)-97 ord(c)-97 ord(c) ord c 97 c c def query(pos): #各文字について1-pos番目までの文字数をカウント
    ret = [0]*26
    for i in range(26):
        tmp = 0
        p = pos
        while p>0:
            tmp += bits[i][p]
            bit_len = p&(-p) #p&(-p)は1のたつ最小桁であり、今の区間の長さをあらわす
            p -= bit_len #つぎに足すべき塊の番号は、今の値から区間の長さを引くとでる
        ret[i] = tmp #アルファベットiの1-posまでの出現回数
    return ret query ret = [0]*26 ret [0]*26 [0] 0 26 for i in range(26):
        tmp = 0
        p = pos
        while p>0:
            tmp += bits[i][p]
            bit_len = p&(-p) #p&(-p)は1のたつ最小桁であり、今の区間の長さをあらわす
            p -= bit_len #つぎに足すべき塊の番号は、今の値から区間の長さを引くとでる
        ret[i] = tmp #アルファベットiの1-posまでの出現回数
     i range(26) range 26 tmp = 0 tmp 0 p = pos p pos while p>0:
            tmp += bits[i][p]
            bit_len = p&(-p) #p&(-p)は1のたつ最小桁であり、今の区間の長さをあらわす
            p -= bit_len #つぎに足すべき塊の番号は、今の値から区間の長さを引くとでる
         p>0 p 0 tmp += bits[i][p] tmp bits[i][p] [i] bits i p bit_len = p&(-p) bit_len p&(-p) p -p p p -= bit_len p bit_len ret[i] = tmp ret[i] ret i tmp return ret ret pos pos def update(pos, a, x): #a番目のアルファベットについてpos番目の要素の値を更新
    while pos <= N:
        bits[a][pos] += x
        pos += pos&(-pos) update while pos <= N:
        bits[a][pos] += x
        pos += pos&(-pos) pos <= N pos N bits[a][pos] += x bits[a][pos] [a] bits a pos x pos += pos&(-pos) pos pos&(-pos) pos -pos pos pos pos a a x x for i in range(N):
    update(i+1, ctoi(S[i]),1) i range(N) range N update(i+1, ctoi(S[i]),1) update i+1 i 1 ctoi(S[i]) ctoi S[i] S i 1 for _ in range(Q):
    q = LST()
    if q[0]=='1':
        i = int(q[1])
        c = q[2]
        if S[i-1]==c:
            continue
        update(i, ctoi(S[i-1]), -1) #S[i-1]のi番目に1が立っているが、これを下ろして削除を表現
        #O(logN)で削除が完了
        update(i, ctoi(c), 1)
        S[i-1] = c
    else:
        ans = 0
        l = int(q[1])
        r = int(q[2])
        r_sum = query(r)
        l_sum = query(l-1)
        for i in range(26):
            if r_sum[i]-l_sum[i] > 0:
                ans += 1
        print(ans) _ range(Q) range Q q = LST() q LST() LST if q[0]=='1':
        i = int(q[1])
        c = q[2]
        if S[i-1]==c:
            continue
        update(i, ctoi(S[i-1]), -1) #S[i-1]のi番目に1が立っているが、これを下ろして削除を表現
        #O(logN)で削除が完了
        update(i, ctoi(c), 1)
        S[i-1] = c
    else:
        ans = 0
        l = int(q[1])
        r = int(q[2])
        r_sum = query(r)
        l_sum = query(l-1)
        for i in range(26):
            if r_sum[i]-l_sum[i] > 0:
                ans += 1
        print(ans) q[0]=='1' q[0] q 0 '1' i = int(q[1]) i int(q[1]) int q[1] q 1 c = q[2] c q[2] q 2 if S[i-1]==c:
            continue
         S[i-1]==c S[i-1] S i-1 i 1 c continue update(i, ctoi(S[i-1]), -1) update i ctoi(S[i-1]) ctoi S[i-1] S i-1 i 1 -1 update(i, ctoi(c), 1) update i ctoi(c) ctoi c 1 S[i-1] = c S[i-1] S i-1 i 1 c ans = 0 ans 0 l = int(q[1]) l int(q[1]) int q[1] q 1 r = int(q[2]) r int(q[2]) int q[2] q 2 r_sum = query(r) r_sum query(r) query r l_sum = query(l-1) l_sum query(l-1) query l-1 l 1 for i in range(26):
            if r_sum[i]-l_sum[i] > 0:
                ans += 1
         i range(26) range 26 if r_sum[i]-l_sum[i] > 0:
                ans += 1
         r_sum[i]-l_sum[i] > 0 r_sum[i]-l_sum[i] r_sum[i] r_sum i l_sum[i] l_sum i 0 ans += 1 ans 1 print(ans) print ans def ctoi(c): #アルファベットを0-25の数字に変換
    return ord(c)-97 def ctoi(c): #アルファベットを0-25の数字に変換
    return ord(c)-97 ctoi i = int(q[1]) int(q[1]) i def LI2(N): return [list(map(int, sys.stdin.readline().split())) for i in range(N)]
#文字列を一文字ずつ数字に変換、'5678'を[5,6,7,8]とできる def LI2(N): return [list(map(int, sys.stdin.readline().split())) for i in range(N)]
#文字列を一文字ずつ数字に変換、'5678'を[5,6,7,8]とできる LI2 def update(pos, a, x): #a番目のアルファベットについてpos番目の要素の値を更新
    while pos <= N:
        bits[a][pos] += x
        pos += pos&(-pos) def update(pos, a, x): #a番目のアルファベットについてpos番目の要素の値を更新
    while pos <= N:
        bits[a][pos] += x
        pos += pos&(-pos) update INF = float("inf") float("inf") INF def ST(): return sys.stdin.readline().rstrip() def ST(): return sys.stdin.readline().rstrip() ST def query(pos): #各文字について1-pos番目までの文字数をカウント
    ret = [0]*26
    for i in range(26):
        tmp = 0
        p = pos
        while p>0:
            tmp += bits[i][p]
            bit_len = p&(-p) #p&(-p)は1のたつ最小桁であり、今の区間の長さをあらわす
            p -= bit_len #つぎに足すべき塊の番号は、今の値から区間の長さを引くとでる
        ret[i] = tmp #アルファベットiの1-posまでの出現回数
    return ret def query(pos): #各文字について1-pos番目までの文字数をカウント
    ret = [0]*26
    for i in range(26):
        tmp = 0
        p = pos
        while p>0:
            tmp += bits[i][p]
            bit_len = p&(-p) #p&(-p)は1のたつ最小桁であり、今の区間の長さをあらわす
            p -= bit_len #つぎに足すべき塊の番号は、今の値から区間の長さを引くとでる
        ret[i] = tmp #アルファベットiの1-posまでの出現回数
    return ret query def MI(): return map(int, sys.stdin.readline().split()) def MI(): return map(int, sys.stdin.readline().split()) MI MOD = 1000000007 1000000007 MOD l_sum = query(l-1) query(l-1) l_sum q = LST() LST() q def LSI(): return list(map(int, list(sys.stdin.readline().rstrip()))) def LSI(): return list(map(int, list(sys.stdin.readline().rstrip()))) LSI def sisha(num,digit): return Decimal(str(num)).quantize(Decimal(digit),rounding=ROUND_HALF_UP)
#'0.01'や'1E1'などで指定、整数に戻すならintをかます def sisha(num,digit): return Decimal(str(num)).quantize(Decimal(digit),rounding=ROUND_HALF_UP)
#'0.01'や'1E1'などで指定、整数に戻すならintをかます sisha r_sum = query(r) query(r) r_sum c = q[2] q[2] c l = int(q[1]) int(q[1]) l N = I() I() N ans += 1 1 ans def FILL2(i,h,w): return [FILL(i,w) for j in range(h)] def FILL2(i,h,w): return [FILL(i,w) for j in range(h)] FILL2 def LST(): return sys.stdin.readline().rstrip().split() def LST(): return sys.stdin.readline().rstrip().split() LST ans = 0 0 ans def LI(): return list(map(int, sys.stdin.readline().split())) def LI(): return list(map(int, sys.stdin.readline().split())) LI def FILL(i,h): return [i for j in range(h)] def FILL(i,h): return [i for j in range(h)] FILL bits=[[0]*(N+1) for _ in range(26)] [[0]*(N+1) for _ in range(26)] bits def LST2(N): return [sys.stdin.readline().rstrip().split() for i in range(N)] def LST2(N): return [sys.stdin.readline().rstrip().split() for i in range(N)] LST2 def LSI2(N): return [list(map(int, list(sys.stdin.readline().rstrip()))) for i in range(N)]
#文字列として取得 def LSI2(N): return [list(map(int, list(sys.stdin.readline().rstrip()))) for i in range(N)]
#文字列として取得 LSI2 S = list(ST()) list(ST()) S Q = I() I() Q def FILL4(i,h,w,d,d2): return [FILL3(i,w,d,d2) for j in range(h)] def FILL4(i,h,w,d,d2): return [FILL3(i,w,d,d2) for j in range(h)] FILL4 def I(): return int(sys.stdin.readline()) def I(): return int(sys.stdin.readline()) I r = int(q[2]) int(q[2]) r def FILL3(i,h,w,d): return [FILL2(i,w,d) for j in range(h)] def FILL3(i,h,w,d): return [FILL2(i,w,d) for j in range(h)] FILL3
import sys
import math
from decimal import Decimal, ROUND_HALF_UP, ROUND_HALF_EVEN
from collections import deque
from bisect import bisect_left
from itertools import product
def I(): return int(sys.stdin.readline())
def MI(): return map(int, sys.stdin.readline().split())
def LI(): return list(map(int, sys.stdin.readline().split()))
def LI2(N): return [list(map(int, sys.stdin.readline().split())) for i in range(N)]
#文字列を一文字ずつ数字に変換、'5678'を[5,6,7,8]とできる
def LSI(): return list(map(int, list(sys.stdin.readline().rstrip())))
def LSI2(N): return [list(map(int, list(sys.stdin.readline().rstrip()))) for i in range(N)]
#文字列として取得
def ST(): return sys.stdin.readline().rstrip()
def LST(): return sys.stdin.readline().rstrip().split()
def LST2(N): return [sys.stdin.readline().rstrip().split() for i in range(N)]
def FILL(i,h): return [i for j in range(h)]
def FILL2(i,h,w): return [FILL(i,w) for j in range(h)]
def FILL3(i,h,w,d): return [FILL2(i,w,d) for j in range(h)]
def FILL4(i,h,w,d,d2): return [FILL3(i,w,d,d2) for j in range(h)]
def sisha(num,digit): return Decimal(str(num)).quantize(Decimal(digit),rounding=ROUND_HALF_UP)
#'0.01'や'1E1'などで指定、整数に戻すならintをかます
MOD = 1000000007
INF = float("inf")
sys.setrecursionlimit(10**6+10)

N = I()
S = list(ST())
Q = I()
bits=[[0]*(N+1) for _ in range(26)]

def ctoi(c): #アルファベットを0-25の数字に変換
    return ord(c)-97

def query(pos): #各文字について1-pos番目までの文字数をカウント
    ret = [0]*26
    for i in range(26):
        tmp = 0
        p = pos
        while p>0:
            tmp += bits[i][p]
            bit_len = p&(-p) #p&(-p)は1のたつ最小桁であり、今の区間の長さをあらわす
            p -= bit_len #つぎに足すべき塊の番号は、今の値から区間の長さを引くとでる
        ret[i] = tmp #アルファベットiの1-posまでの出現回数
    return ret

def update(pos, a, x): #a番目のアルファベットについてpos番目の要素の値を更新
    while pos <= N:
        bits[a][pos] += x
        pos += pos&(-pos)

for i in range(N):
    update(i+1, ctoi(S[i]),1)
for _ in range(Q):
    q = LST()
    if q[0]=='1':
        i = int(q[1])
        c = q[2]
        if S[i-1]==c:
            continue
        update(i, ctoi(S[i-1]), -1) #S[i-1]のi番目に1が立っているが、これを下ろして削除を表現
        #O(logN)で削除が完了
        update(i, ctoi(c), 1)
        S[i-1] = c
    else:
        ans = 0
        l = int(q[1])
        r = int(q[2])
        r_sum = query(r)
        l_sum = query(l-1)
        for i in range(26):
            if r_sum[i]-l_sum[i] > 0:
                ans += 1
        print(ans)
