import bisect
import sys
input = lambda: sys.stdin.readline().rstrip()

n=int(input())
s= list(input())
q=[]
qq=int(input())
for i in range(qq):
    q.append(list(input().split()))

# アルファベットごとに出現位置を記録
x=[[] for i in range(26)]
for i,j in enumerate(s):
    x[ord(j)-97].append(i)

# 終点対策
for i in range(26):
    x[i].append(5*10**5)


for i,j,k in q:
    if int(i)==1:
        if s[int(j)-1]!=k:
            v=s[int(j)-1]
            s[int(j)-1]=k
            # 変更前の要素を削除
            index=bisect.bisect_right(x[ord(v)-97], int(j)-1) - 1
            x[ord(v)-97].pop(index)
            # 変更後の要素を加える
            bisect.insort_right(x[ord(k)-97],int(j)-1)
    else:
        cnt=0
        j=int(j)-1
        k=int(k)-1
        for l in range(26):
            index=bisect.bisect_left(x[l],j)
            if x[l][index]<=k:
                cnt+=1


        print(cnt) import bisect bisect import sys sys input = lambda: sys.stdin.readline().rstrip() input lambda: sys.stdin.readline().rstrip() sys.stdin.readline().rstrip() sys.stdin.readline().rstrip sys.stdin.readline() sys.stdin.readline sys.stdin sys stdin readline rstrip n=int(input()) n int(input()) int input() input s= list(input()) s list(input()) list input() input q=[] q [] qq=int(input()) qq int(input()) int input() input for i in range(qq):
    q.append(list(input().split()))

# アルファベットごとに出現位置を記録 i range(qq) range qq q.append(list(input().split())) q.append q append list(input().split()) list input().split() ().split () input split [] for i in range(26) for i in range(26) i range(26) range 26 for i in range(26) [] x=[[] for i in range(26)] x [[] for i in range(26)] for i,j in enumerate(s):
    x[ord(j)-97].append(i)

# 終点対策 i j enumerate(s) enumerate s x[ord(j)-97].append(i) [ord(j)-97].append [ord(j)-97] x ord(j)-97 ord(j) ord j 97 append i for i in range(26):
    x[i].append(5*10**5) i range(26) range 26 x[i].append(5*10**5) [i].append [i] x i append 5*10**5 5 10**5 10 5 for i,j,k in q:
    if int(i)==1:
        if s[int(j)-1]!=k:
            v=s[int(j)-1]
            s[int(j)-1]=k
            # 変更前の要素を削除
            index=bisect.bisect_right(x[ord(v)-97], int(j)-1) - 1
            x[ord(v)-97].pop(index)
            # 変更後の要素を加える
            bisect.insort_right(x[ord(k)-97],int(j)-1)
    else:
        cnt=0
        j=int(j)-1
        k=int(k)-1
        for l in range(26):
            index=bisect.bisect_left(x[l],j)
            if x[l][index]<=k:
                cnt+=1


        print(cnt) i j k q if int(i)==1:
        if s[int(j)-1]!=k:
            v=s[int(j)-1]
            s[int(j)-1]=k
            # 変更前の要素を削除
            index=bisect.bisect_right(x[ord(v)-97], int(j)-1) - 1
            x[ord(v)-97].pop(index)
            # 変更後の要素を加える
            bisect.insort_right(x[ord(k)-97],int(j)-1)
    else:
        cnt=0
        j=int(j)-1
        k=int(k)-1
        for l in range(26):
            index=bisect.bisect_left(x[l],j)
            if x[l][index]<=k:
                cnt+=1


        print(cnt) int(i)==1 int(i) int i 1 if s[int(j)-1]!=k:
            v=s[int(j)-1]
            s[int(j)-1]=k
            # 変更前の要素を削除
            index=bisect.bisect_right(x[ord(v)-97], int(j)-1) - 1
            x[ord(v)-97].pop(index)
            # 変更後の要素を加える
            bisect.insort_right(x[ord(k)-97],int(j)-1)
     s[int(j)-1]!=k s[int(j)-1] s int(j)-1 int(j) int j 1 k v=s[int(j)-1] v s[int(j)-1] s int(j)-1 int(j) int j 1 s[int(j)-1]=k s[int(j)-1] s int(j)-1 int(j) int j 1 k index=bisect.bisect_right(x[ord(v)-97], int(j)-1) - 1 index bisect.bisect_right(x[ord(v)-97], int(j)-1) - 1 bisect.bisect_right(x[ord(v)-97], int(j)-1) bisect.bisect_right bisect bisect_right x[ord(v)-97] x ord(v)-97 ord(v) ord v 97 int(j)-1 int(j) int j 1 1 x[ord(v)-97].pop(index) [ord(v)-97].pop [ord(v)-97] x ord(v)-97 ord(v) ord v 97 pop index bisect.insort_right(x[ord(k)-97],int(j)-1) bisect.insort_right bisect insort_right x[ord(k)-97] x ord(k)-97 ord(k) ord k 97 int(j)-1 int(j) int j 1 cnt=0 cnt 0 j=int(j)-1 j int(j)-1 int(j) int j 1 k=int(k)-1 k int(k)-1 int(k) int k 1 for l in range(26):
            index=bisect.bisect_left(x[l],j)
            if x[l][index]<=k:
                cnt+=1


         l range(26) range 26 index=bisect.bisect_left(x[l],j) index bisect.bisect_left(x[l],j) bisect.bisect_left bisect bisect_left x[l] x l j if x[l][index]<=k:
                cnt+=1


         x[l][index]<=k x[l][index] [l] x l index k cnt+=1 cnt 1 print(cnt) print cnt input = lambda: sys.stdin.readline().rstrip() lambda: sys.stdin.readline().rstrip() input qq=int(input()) int(input()) qq j=int(j)-1 int(j)-1 j q=[] [] q x=[[] for i in range(26)] [[] for i in range(26)] x index=bisect.bisect_left(x[l],j) bisect.bisect_left(x[l],j) index k=int(k)-1 int(k)-1 k cnt+=1 1 cnt index=bisect.bisect_right(x[ord(v)-97], int(j)-1) - 1 bisect.bisect_right(x[ord(v)-97], int(j)-1) - 1 index v=s[int(j)-1] s[int(j)-1] v cnt=0 0 cnt n=int(input()) int(input()) n s= list(input()) list(input()) s
import bisect
import sys
input = lambda: sys.stdin.readline().rstrip()

n=int(input())
s= list(input())
q=[]
qq=int(input())
for i in range(qq):
    q.append(list(input().split()))

# アルファベットごとに出現位置を記録
x=[[] for i in range(26)]
for i,j in enumerate(s):
    x[ord(j)-97].append(i)

# 終点対策
for i in range(26):
    x[i].append(5*10**5)


for i,j,k in q:
    if int(i)==1:
        if s[int(j)-1]!=k:
            v=s[int(j)-1]
            s[int(j)-1]=k
            # 変更前の要素を削除
            index=bisect.bisect_right(x[ord(v)-97], int(j)-1) - 1
            x[ord(v)-97].pop(index)
            # 変更後の要素を加える
            bisect.insort_right(x[ord(k)-97],int(j)-1)
    else:
        cnt=0
        j=int(j)-1
        k=int(k)-1
        for l in range(26):
            index=bisect.bisect_left(x[l],j)
            if x[l][index]<=k:
                cnt+=1


        print(cnt)