from collections import defaultdict
from bisect import bisect_left, bisect_right, insort_left, insort_right
import sys
input = sys.stdin.readline


def main():
    N = int(input())
    S = list(input())
    q = int(input())
    Q = [input() for _ in range(q)]

    dd = defaultdict(list)  # 各アルファベットが出現するインデックスをddに登録
    for i in range(ord('a'), ord('z') + 1):
        dd[chr(i)] = []
    for i, st in enumerate(S):
        dd[st].append(i)

    ans = []
    for q in Q:
        t, a, b = q.split()
        a = int(a) - 1
        if int(t) == 1:
            if S[a] == b: continue
            # 二分探索で該当するインデックスを取得
            id = bisect_left(dd[S[a]], a)
            dd[S[a]].pop(id)  # 取ってくる
            insort_left(dd[b], a)  # 新規に挿入する
            S[a] = b
        else:
            b = int(b) - 1
            cnt = 0
            for l in dd.values():
                # liの中身が存在し，
                # そのアルファベットの最後のインデックスが指定されている最初のindexよりも大きく．
                # a以上の最初のindexがb以下の時は，そのアルファベットの存在は保証される
                if l and a <= l[-1] and l[bisect_left(l, a)] <= b:
                    cnt += 1
            ans.append(cnt)
    print(*ans, sep='\n')

if __name__ == '__main__':
    main() from collections import defaultdict from bisect import bisect_left, bisect_right, insort_left, insort_right import sys sys input = sys.stdin.readline input sys.stdin.readline sys.stdin sys stdin readline def main():
    N = int(input())
    S = list(input())
    q = int(input())
    Q = [input() for _ in range(q)]

    dd = defaultdict(list)  # 各アルファベットが出現するインデックスをddに登録
    for i in range(ord('a'), ord('z') + 1):
        dd[chr(i)] = []
    for i, st in enumerate(S):
        dd[st].append(i)

    ans = []
    for q in Q:
        t, a, b = q.split()
        a = int(a) - 1
        if int(t) == 1:
            if S[a] == b: continue
            # 二分探索で該当するインデックスを取得
            id = bisect_left(dd[S[a]], a)
            dd[S[a]].pop(id)  # 取ってくる
            insort_left(dd[b], a)  # 新規に挿入する
            S[a] = b
        else:
            b = int(b) - 1
            cnt = 0
            for l in dd.values():
                # liの中身が存在し，
                # そのアルファベットの最後のインデックスが指定されている最初のindexよりも大きく．
                # a以上の最初のindexがb以下の時は，そのアルファベットの存在は保証される
                if l and a <= l[-1] and l[bisect_left(l, a)] <= b:
                    cnt += 1
            ans.append(cnt)
    print(*ans, sep='\n') main N = int(input()) N int(input()) int input() input S = list(input()) S list(input()) list input() input q = int(input()) q int(input()) int input() input input() for _ in range(q) for _ in range(q) _ range(q) range q for _ in range(q) input() input Q = [input() for _ in range(q)] Q [input() for _ in range(q)] dd = defaultdict(list) dd defaultdict(list) defaultdict list for i in range(ord('a'), ord('z') + 1):
        dd[chr(i)] = []
     i range(ord('a'), ord('z') + 1) range ord('a') ord 'a' ord('z') + 1 ord('z') ord 'z' 1 dd[chr(i)] = [] dd[chr(i)] dd chr(i) chr i [] for i, st in enumerate(S):
        dd[st].append(i)

     i st enumerate(S) enumerate S dd[st].append(i) [st].append [st] dd st append i ans = [] ans [] for q in Q:
        t, a, b = q.split()
        a = int(a) - 1
        if int(t) == 1:
            if S[a] == b: continue
            # 二分探索で該当するインデックスを取得
            id = bisect_left(dd[S[a]], a)
            dd[S[a]].pop(id)  # 取ってくる
            insort_left(dd[b], a)  # 新規に挿入する
            S[a] = b
        else:
            b = int(b) - 1
            cnt = 0
            for l in dd.values():
                # liの中身が存在し，
                # そのアルファベットの最後のインデックスが指定されている最初のindexよりも大きく．
                # a以上の最初のindexがb以下の時は，そのアルファベットの存在は保証される
                if l and a <= l[-1] and l[bisect_left(l, a)] <= b:
                    cnt += 1
            ans.append(cnt)
     q Q t, a, b = q.split() t q.split() q.split q split a b a = int(a) - 1 a int(a) - 1 int(a) int a 1 if int(t) == 1:
            if S[a] == b: continue
            # 二分探索で該当するインデックスを取得
            id = bisect_left(dd[S[a]], a)
            dd[S[a]].pop(id)  # 取ってくる
            insort_left(dd[b], a)  # 新規に挿入する
            S[a] = b
        else:
            b = int(b) - 1
            cnt = 0
            for l in dd.values():
                # liの中身が存在し，
                # そのアルファベットの最後のインデックスが指定されている最初のindexよりも大きく．
                # a以上の最初のindexがb以下の時は，そのアルファベットの存在は保証される
                if l and a <= l[-1] and l[bisect_left(l, a)] <= b:
                    cnt += 1
            ans.append(cnt)
     int(t) == 1 int(t) int t 1 if S[a] == b: continue
            # 二分探索で該当するインデックスを取得
             S[a] == b S[a] S a b id = bisect_left(dd[S[a]], a) id bisect_left(dd[S[a]], a) bisect_left dd[S[a]] dd S[a] S a a dd[S[a]].pop(id) [S[a]].pop [S[a]] dd S[a] S a pop id insort_left(dd[b], a) insort_left dd[b] dd b a S[a] = b S[a] S a b b = int(b) - 1 b int(b) - 1 int(b) int b 1 cnt = 0 cnt 0 for l in dd.values():
                # liの中身が存在し，
                # そのアルファベットの最後のインデックスが指定されている最初のindexよりも大きく．
                # a以上の最初のindexがb以下の時は，そのアルファベットの存在は保証される
                if l and a <= l[-1] and l[bisect_left(l, a)] <= b:
                    cnt += 1
             l dd.values() dd.values dd values if l and a <= l[-1] and l[bisect_left(l, a)] <= b:
                    cnt += 1
             l and a <= l[-1] and l[bisect_left(l, a)] <= b l and a <= l[-1] l a <= l[-1] a l[-1] l -1 l[bisect_left(l, a)] <= b l[bisect_left(l, a)] l bisect_left(l, a) bisect_left l a b cnt += 1 cnt 1 ans.append(cnt) ans.append ans append cnt print(*ans, sep='\n') print *ans ans sep='\n' sep '\n' if __name__ == '__main__':
    main() __name__ == '__main__' __name__ '__main__' main() main input = sys.stdin.readline sys.stdin.readline input def main():
    N = int(input())
    S = list(input())
    q = int(input())
    Q = [input() for _ in range(q)]

    dd = defaultdict(list)  # 各アルファベットが出現するインデックスをddに登録
    for i in range(ord('a'), ord('z') + 1):
        dd[chr(i)] = []
    for i, st in enumerate(S):
        dd[st].append(i)

    ans = []
    for q in Q:
        t, a, b = q.split()
        a = int(a) - 1
        if int(t) == 1:
            if S[a] == b: continue
            # 二分探索で該当するインデックスを取得
            id = bisect_left(dd[S[a]], a)
            dd[S[a]].pop(id)  # 取ってくる
            insort_left(dd[b], a)  # 新規に挿入する
            S[a] = b
        else:
            b = int(b) - 1
            cnt = 0
            for l in dd.values():
                # liの中身が存在し，
                # そのアルファベットの最後のインデックスが指定されている最初のindexよりも大きく．
                # a以上の最初のindexがb以下の時は，そのアルファベットの存在は保証される
                if l and a <= l[-1] and l[bisect_left(l, a)] <= b:
                    cnt += 1
            ans.append(cnt)
    print(*ans, sep='\n') def main():
    N = int(input())
    S = list(input())
    q = int(input())
    Q = [input() for _ in range(q)]

    dd = defaultdict(list)  # 各アルファベットが出現するインデックスをddに登録
    for i in range(ord('a'), ord('z') + 1):
        dd[chr(i)] = []
    for i, st in enumerate(S):
        dd[st].append(i)

    ans = []
    for q in Q:
        t, a, b = q.split()
        a = int(a) - 1
        if int(t) == 1:
            if S[a] == b: continue
            # 二分探索で該当するインデックスを取得
            id = bisect_left(dd[S[a]], a)
            dd[S[a]].pop(id)  # 取ってくる
            insort_left(dd[b], a)  # 新規に挿入する
            S[a] = b
        else:
            b = int(b) - 1
            cnt = 0
            for l in dd.values():
                # liの中身が存在し，
                # そのアルファベットの最後のインデックスが指定されている最初のindexよりも大きく．
                # a以上の最初のindexがb以下の時は，そのアルファベットの存在は保証される
                if l and a <= l[-1] and l[bisect_left(l, a)] <= b:
                    cnt += 1
            ans.append(cnt)
    print(*ans, sep='\n') main
from collections import defaultdict
from bisect import bisect_left, bisect_right, insort_left, insort_right
import sys
input = sys.stdin.readline


def main():
    N = int(input())
    S = list(input())
    q = int(input())
    Q = [input() for _ in range(q)]

    dd = defaultdict(list)  # 各アルファベットが出現するインデックスをddに登録
    for i in range(ord('a'), ord('z') + 1):
        dd[chr(i)] = []
    for i, st in enumerate(S):
        dd[st].append(i)

    ans = []
    for q in Q:
        t, a, b = q.split()
        a = int(a) - 1
        if int(t) == 1:
            if S[a] == b: continue
            # 二分探索で該当するインデックスを取得
            id = bisect_left(dd[S[a]], a)
            dd[S[a]].pop(id)  # 取ってくる
            insort_left(dd[b], a)  # 新規に挿入する
            S[a] = b
        else:
            b = int(b) - 1
            cnt = 0
            for l in dd.values():
                # liの中身が存在し，
                # そのアルファベットの最後のインデックスが指定されている最初のindexよりも大きく．
                # a以上の最初のindexがb以下の時は，そのアルファベットの存在は保証される
                if l and a <= l[-1] and l[bisect_left(l, a)] <= b:
                    cnt += 1
            ans.append(cnt)
    print(*ans, sep='\n')

if __name__ == '__main__':
    main()