from sys import stdin

class SegmentTree:
    # 初期化処理
    # f : SegmentTreeにのせるモノイド
    # default : fに対する単位元
    def __init__(self, size, f=lambda x,y : x+y, default=0):
        self.size = 2**(size-1).bit_length() # 簡単のため要素数Nを2冪にする
        self.default = default
        self.dat = [default]*(self.size*2) # 要素を単位元で初期化
        self.f = f

    def update(self, i, x):
        i += self.size
        self.dat[i] = x
        while i > 0:
            i >>= 1
            self.dat[i] = self.f(self.dat[i*2], self.dat[i*2+1])

    def query(self, l, r):
        l += self.size
        r += self.size
        lres, rres = self.default, self.default
        while l < r:
            if l & 1:
                lres = self.f(lres, self.dat[l])
                l += 1

            if r & 1:
                r -= 1
                rres = self.f(self.dat[r], rres) # モノイドでは可換律は保証されていないので演算の方向に注意
            l >>= 1
            r >>= 1
        res = self.f(lres, rres)
        return res
def bc(x):
    return bin(x).count("1")

n = int(stdin.readline().rstrip())
s = stdin.readline().rstrip()
q = int(stdin.readline().rstrip())

lamb_or = lambda x,y : x|y
seg = SegmentTree(n,lamb_or,0)

for i,x in enumerate(s):
    seg.update(i,1 << ord(x)-97)

for _ in range(q):
    c,x,y = [x for x in stdin.readline().rstrip().split()]
    if c == '1':
        x = int(x)
        seg.update(x-1,1 << ord(y)-97)
    elif c == '2':
        x = int(x)
        y = int(y)
        print(bc(seg.query(x-1,y))) from sys import stdin class SegmentTree:
    # 初期化処理
    # f : SegmentTreeにのせるモノイド
    # default : fに対する単位元
    def __init__(self, size, f=lambda x,y : x+y, default=0):
        self.size = 2**(size-1).bit_length() # 簡単のため要素数Nを2冪にする
        self.default = default
        self.dat = [default]*(self.size*2) # 要素を単位元で初期化
        self.f = f

    def update(self, i, x):
        i += self.size
        self.dat[i] = x
        while i > 0:
            i >>= 1
            self.dat[i] = self.f(self.dat[i*2], self.dat[i*2+1])

    def query(self, l, r):
        l += self.size
        r += self.size
        lres, rres = self.default, self.default
        while l < r:
            if l & 1:
                lres = self.f(lres, self.dat[l])
                l += 1

            if r & 1:
                r -= 1
                rres = self.f(self.dat[r], rres) # モノイドでは可換律は保証されていないので演算の方向に注意
            l >>= 1
            r >>= 1
        res = self.f(lres, rres)
        return res SegmentTree def __init__(self, size, f=lambda x,y : x+y, default=0):
        self.size = 2**(size-1).bit_length() # 簡単のため要素数Nを2冪にする
        self.default = default
        self.dat = [default]*(self.size*2) # 要素を単位元で初期化
        self.f = f

     __init__ self.size = 2**(size-1).bit_length() self.size self size 2**(size-1).bit_length() 2 (size-1).bit_length() size-1).bit_length size-1 size 1 bit_length self.default = default self.default self default default self.dat = [default]*(self.size*2) self.dat self dat [default]*(self.size*2) [default] default self.size*2 self.size self size 2 self.f = f self.f self f f self self size size f=lambda x,y : x+y f lambda x,y : x+y x+y x y x y default=0 default 0 def update(self, i, x):
        i += self.size
        self.dat[i] = x
        while i > 0:
            i >>= 1
            self.dat[i] = self.f(self.dat[i*2], self.dat[i*2+1])

     update i += self.size i self.size self size self.dat[i] = x self.dat[i] self.dat self dat i x while i > 0:
            i >>= 1
            self.dat[i] = self.f(self.dat[i*2], self.dat[i*2+1])

     i > 0 i 0 i >>= 1 i 1 self.dat[i] = self.f(self.dat[i*2], self.dat[i*2+1]) self.dat[i] self.dat self dat i self.f(self.dat[i*2], self.dat[i*2+1]) self.f self f self.dat[i*2] self.dat self dat i*2 i 2 self.dat[i*2+1] self.dat self dat i*2+1 i*2 i 2 1 self self i i x x def query(self, l, r):
        l += self.size
        r += self.size
        lres, rres = self.default, self.default
        while l < r:
            if l & 1:
                lres = self.f(lres, self.dat[l])
                l += 1

            if r & 1:
                r -= 1
                rres = self.f(self.dat[r], rres) # モノイドでは可換律は保証されていないので演算の方向に注意
            l >>= 1
            r >>= 1
        res = self.f(lres, rres)
        return res query l += self.size l self.size self size r += self.size r self.size self size lres, rres = self.default, self.default lres self.default self default rres self.default self default while l < r:
            if l & 1:
                lres = self.f(lres, self.dat[l])
                l += 1

            if r & 1:
                r -= 1
                rres = self.f(self.dat[r], rres) # モノイドでは可換律は保証されていないので演算の方向に注意
            l >>= 1
            r >>= 1
         l < r l r if l & 1:
                lres = self.f(lres, self.dat[l])
                l += 1

             l & 1 l 1 lres = self.f(lres, self.dat[l]) lres self.f(lres, self.dat[l]) self.f self f lres self.dat[l] self.dat self dat l l += 1 l 1 if r & 1:
                r -= 1
                rres = self.f(self.dat[r], rres) # モノイドでは可換律は保証されていないので演算の方向に注意
             r & 1 r 1 r -= 1 r 1 rres = self.f(self.dat[r], rres) rres self.f(self.dat[r], rres) self.f self f self.dat[r] self.dat self dat r rres l >>= 1 l 1 r >>= 1 r 1 res = self.f(lres, rres) res self.f(lres, rres) self.f self f lres rres return res res self self l l r r def bc(x):
    return bin(x).count("1") bc return bin(x).count("1") bin(x).count("1") (x).count (x) bin x count "1" x x n = int(stdin.readline().rstrip()) n int(stdin.readline().rstrip()) int stdin.readline().rstrip() stdin.readline().rstrip stdin.readline() stdin.readline stdin readline rstrip s = stdin.readline().rstrip() s stdin.readline().rstrip() stdin.readline().rstrip stdin.readline() stdin.readline stdin readline rstrip q = int(stdin.readline().rstrip()) q int(stdin.readline().rstrip()) int stdin.readline().rstrip() stdin.readline().rstrip stdin.readline() stdin.readline stdin readline rstrip lamb_or = lambda x,y : x|y lamb_or lambda x,y : x|y x|y x y x y seg = SegmentTree(n,lamb_or,0) seg SegmentTree(n,lamb_or,0) SegmentTree n lamb_or 0 for i,x in enumerate(s):
    seg.update(i,1 << ord(x)-97) i x enumerate(s) enumerate s seg.update(i,1 << ord(x)-97) seg.update seg update i 1 << ord(x)-97 1 ord(x)-97 ord(x) ord x 97 for _ in range(q):
    c,x,y = [x for x in stdin.readline().rstrip().split()]
    if c == '1':
        x = int(x)
        seg.update(x-1,1 << ord(y)-97)
    elif c == '2':
        x = int(x)
        y = int(y)
        print(bc(seg.query(x-1,y))) _ range(q) range q x for x in stdin.readline().rstrip().split() for x in stdin.readline().rstrip().split() x stdin.readline().rstrip().split() stdin.readline().rstrip().split stdin.readline().rstrip() stdin.readline().rstrip stdin.readline() stdin.readline stdin readline rstrip split for x in stdin.readline().rstrip().split() x c,x,y = [x for x in stdin.readline().rstrip().split()] c [x for x in stdin.readline().rstrip().split()] x y if c == '1':
        x = int(x)
        seg.update(x-1,1 << ord(y)-97)
    elif c == '2':
        x = int(x)
        y = int(y)
        print(bc(seg.query(x-1,y))) c == '1' c '1' x = int(x) x int(x) int x seg.update(x-1,1 << ord(y)-97) seg.update seg update x-1 x 1 1 << ord(y)-97 1 ord(y)-97 ord(y) ord y 97 elif c == '2':
        x = int(x)
        y = int(y)
        print(bc(seg.query(x-1,y))) c == '2' c '2' x = int(x) x int(x) int x y = int(y) y int(y) int y print(bc(seg.query(x-1,y))) print bc(seg.query(x-1,y)) bc seg.query(x-1,y) seg.query seg query x-1 x 1 y s = stdin.readline().rstrip() stdin.readline().rstrip() s c,x,y = [x for x in stdin.readline().rstrip().split()] [x for x in stdin.readline().rstrip().split()] c x = int(x) int(x) x class SegmentTree:
    # 初期化処理
    # f : SegmentTreeにのせるモノイド
    # default : fに対する単位元
    def __init__(self, size, f=lambda x,y : x+y, default=0):
        self.size = 2**(size-1).bit_length() # 簡単のため要素数Nを2冪にする
        self.default = default
        self.dat = [default]*(self.size*2) # 要素を単位元で初期化
        self.f = f

    def update(self, i, x):
        i += self.size
        self.dat[i] = x
        while i > 0:
            i >>= 1
            self.dat[i] = self.f(self.dat[i*2], self.dat[i*2+1])

    def query(self, l, r):
        l += self.size
        r += self.size
        lres, rres = self.default, self.default
        while l < r:
            if l & 1:
                lres = self.f(lres, self.dat[l])
                l += 1

            if r & 1:
                r -= 1
                rres = self.f(self.dat[r], rres) # モノイドでは可換律は保証されていないので演算の方向に注意
            l >>= 1
            r >>= 1
        res = self.f(lres, rres)
        return res class SegmentTree:
    # 初期化処理
    # f : SegmentTreeにのせるモノイド
    # default : fに対する単位元
    def __init__(self, size, f=lambda x,y : x+y, default=0):
        self.size = 2**(size-1).bit_length() # 簡単のため要素数Nを2冪にする
        self.default = default
        self.dat = [default]*(self.size*2) # 要素を単位元で初期化
        self.f = f

    def update(self, i, x):
        i += self.size
        self.dat[i] = x
        while i > 0:
            i >>= 1
            self.dat[i] = self.f(self.dat[i*2], self.dat[i*2+1])

    def query(self, l, r):
        l += self.size
        r += self.size
        lres, rres = self.default, self.default
        while l < r:
            if l & 1:
                lres = self.f(lres, self.dat[l])
                l += 1

            if r & 1:
                r -= 1
                rres = self.f(self.dat[r], rres) # モノイドでは可換律は保証されていないので演算の方向に注意
            l >>= 1
            r >>= 1
        res = self.f(lres, rres)
        return res SegmentTree q = int(stdin.readline().rstrip()) int(stdin.readline().rstrip()) q n = int(stdin.readline().rstrip()) int(stdin.readline().rstrip()) n x,y = [x for x in stdin.readline().rstrip().split()] [x for x in stdin.readline().rstrip().split()] x def bc(x):
    return bin(x).count("1") def bc(x):
    return bin(x).count("1") bc seg = SegmentTree(n,lamb_or,0) SegmentTree(n,lamb_or,0) seg y = [x for x in stdin.readline().rstrip().split()] [x for x in stdin.readline().rstrip().split()] y x = int(x) int(x) x lamb_or = lambda x,y : x|y lambda x,y : x|y lamb_or y = int(y) int(y) y
from sys import stdin

class SegmentTree:
    # 初期化処理
    # f : SegmentTreeにのせるモノイド
    # default : fに対する単位元
    def __init__(self, size, f=lambda x,y : x+y, default=0):
        self.size = 2**(size-1).bit_length() # 簡単のため要素数Nを2冪にする
        self.default = default
        self.dat = [default]*(self.size*2) # 要素を単位元で初期化
        self.f = f

    def update(self, i, x):
        i += self.size
        self.dat[i] = x
        while i > 0:
            i >>= 1
            self.dat[i] = self.f(self.dat[i*2], self.dat[i*2+1])

    def query(self, l, r):
        l += self.size
        r += self.size
        lres, rres = self.default, self.default
        while l < r:
            if l & 1:
                lres = self.f(lres, self.dat[l])
                l += 1

            if r & 1:
                r -= 1
                rres = self.f(self.dat[r], rres) # モノイドでは可換律は保証されていないので演算の方向に注意
            l >>= 1
            r >>= 1
        res = self.f(lres, rres)
        return res
def bc(x):
    return bin(x).count("1")

n = int(stdin.readline().rstrip())
s = stdin.readline().rstrip()
q = int(stdin.readline().rstrip())

lamb_or = lambda x,y : x|y
seg = SegmentTree(n,lamb_or,0)

for i,x in enumerate(s):
    seg.update(i,1 << ord(x)-97)

for _ in range(q):
    c,x,y = [x for x in stdin.readline().rstrip().split()]
    if c == '1':
        x = int(x)
        seg.update(x-1,1 << ord(y)-97)
    elif c == '2':
        x = int(x)
        y = int(y)
        print(bc(seg.query(x-1,y)))
