#import sys
#import numpy as np
import math
#from fractions import Fraction
import itertools
from collections import deque
from collections import Counter
#import heapq
#from fractions  import gcd
#input=sys.stdin.readline
import bisect
n=int(input())
s=input()
q=int(input())

inf = set()
num_min =2**(n-1).bit_length()
dat=[inf]*(2*num_min-1)

#初期化
for i in range(n):
    dat[i+num_min-1]=set(s[i])
for i in range(num_min-2,-1,-1):
    dat[i]=dat[2*i+1].union(dat[2*i+2])

#親のノード(n-1)//2
#子のノード2n+1,2n+2

def segfunc(x,y):
    return x.union(y)

def update(i,x):
    i+=num_min-1
    dat[i]=x
    while i>0:
        i=(i-1)//2
        dat[i]=segfunc(dat[2*i+1],dat[2*i+2])
def query(a,b): #半開区間、[a,b)の最小値
    if b<=a:
        return inf
    res=inf
    a += num_min-1
    b += num_min-2
    while b-a>1:
        if a&1==0:
            res = segfunc(res,dat[a])
        if b&1==1:
            res = segfunc(res,dat[b])
            b-=1
        a=a//2
        b=(b-1)//2
    if a==b:
        res = segfunc(res,dat[a])
    else:
        res=segfunc(segfunc(res,dat[a]),dat[b])
    return res

for i in range(q):
  t,l,r=input().split()
  if t=="1":
    update(int(l)-1,set(r))
  else:
    ans=query(int(l)-1,int(r))
    print(len(ans)) import math math import itertools itertools from collections import deque from collections import Counter import bisect bisect n=int(input()) n int(input()) int input() input s=input() s input() input q=int(input()) q int(input()) int input() input inf = set() inf set() set num_min =2**(n-1).bit_length() num_min 2**(n-1).bit_length() 2 (n-1).bit_length() n-1).bit_length n-1 n 1 bit_length dat=[inf]*(2*num_min-1) dat [inf]*(2*num_min-1) [inf] inf 2*num_min-1 2*num_min 2 num_min 1 for i in range(n):
    dat[i+num_min-1]=set(s[i]) i range(n) range n dat[i+num_min-1]=set(s[i]) dat[i+num_min-1] dat i+num_min-1 i+num_min i num_min 1 set(s[i]) set s[i] s i for i in range(num_min-2,-1,-1):
    dat[i]=dat[2*i+1].union(dat[2*i+2])

#親のノード(n-1)//2
#子のノード2n+1,2n+2 i range(num_min-2,-1,-1) range num_min-2 num_min 2 -1 -1 dat[i]=dat[2*i+1].union(dat[2*i+2]) dat[i] dat i dat[2*i+1].union(dat[2*i+2]) [2*i+1].union [2*i+1] dat 2*i+1 2*i 2 i 1 union dat[2*i+2] dat 2*i+2 2*i 2 i 2 def segfunc(x,y):
    return x.union(y) segfunc return x.union(y) x.union(y) x.union x union y x x y y def update(i,x):
    i+=num_min-1
    dat[i]=x
    while i>0:
        i=(i-1)//2
        dat[i]=segfunc(dat[2*i+1],dat[2*i+2]) update i+=num_min-1 i num_min-1 num_min 1 dat[i]=x dat[i] dat i x while i>0:
        i=(i-1)//2
        dat[i]=segfunc(dat[2*i+1],dat[2*i+2]) i>0 i 0 i=(i-1)//2 i (i-1)//2 i-1 i 1 2 dat[i]=segfunc(dat[2*i+1],dat[2*i+2]) dat[i] dat i segfunc(dat[2*i+1],dat[2*i+2]) segfunc dat[2*i+1] dat 2*i+1 2*i 2 i 1 dat[2*i+2] dat 2*i+2 2*i 2 i 2 i i x x def query(a,b): #半開区間、[a,b)の最小値
    if b<=a:
        return inf
    res=inf
    a += num_min-1
    b += num_min-2
    while b-a>1:
        if a&1==0:
            res = segfunc(res,dat[a])
        if b&1==1:
            res = segfunc(res,dat[b])
            b-=1
        a=a//2
        b=(b-1)//2
    if a==b:
        res = segfunc(res,dat[a])
    else:
        res=segfunc(segfunc(res,dat[a]),dat[b])
    return res query if b<=a:
        return inf
     b<=a b a return inf inf res=inf res inf a += num_min-1 a num_min-1 num_min 1 b += num_min-2 b num_min-2 num_min 2 while b-a>1:
        if a&1==0:
            res = segfunc(res,dat[a])
        if b&1==1:
            res = segfunc(res,dat[b])
            b-=1
        a=a//2
        b=(b-1)//2
     b-a>1 b-a b a 1 if a&1==0:
            res = segfunc(res,dat[a])
         a&1==0 a&1 a 1 0 res = segfunc(res,dat[a]) res segfunc(res,dat[a]) segfunc res dat[a] dat a if b&1==1:
            res = segfunc(res,dat[b])
            b-=1
         b&1==1 b&1 b 1 1 res = segfunc(res,dat[b]) res segfunc(res,dat[b]) segfunc res dat[b] dat b b-=1 b 1 a=a//2 a a//2 a 2 b=(b-1)//2 b (b-1)//2 b-1 b 1 2 if a==b:
        res = segfunc(res,dat[a])
    else:
        res=segfunc(segfunc(res,dat[a]),dat[b])
     a==b a b res = segfunc(res,dat[a]) res segfunc(res,dat[a]) segfunc res dat[a] dat a res=segfunc(segfunc(res,dat[a]),dat[b]) res segfunc(segfunc(res,dat[a]),dat[b]) segfunc segfunc(res,dat[a]) segfunc res dat[a] dat a dat[b] dat b return res res a a b b for i in range(q):
  t,l,r=input().split()
  if t=="1":
    update(int(l)-1,set(r))
  else:
    ans=query(int(l)-1,int(r))
    print(len(ans)) i range(q) range q t,l,r=input().split() t input().split() ().split () input split l r if t=="1":
    update(int(l)-1,set(r))
  else:
    ans=query(int(l)-1,int(r))
    print(len(ans)) t=="1" t "1" update(int(l)-1,set(r)) update int(l)-1 int(l) int l 1 set(r) set r ans=query(int(l)-1,int(r)) ans query(int(l)-1,int(r)) query int(l)-1 int(l) int l 1 int(r) int r print(len(ans)) print len(ans) len ans s=input() input() s def query(a,b): #半開区間、[a,b)の最小値
    if b<=a:
        return inf
    res=inf
    a += num_min-1
    b += num_min-2
    while b-a>1:
        if a&1==0:
            res = segfunc(res,dat[a])
        if b&1==1:
            res = segfunc(res,dat[b])
            b-=1
        a=a//2
        b=(b-1)//2
    if a==b:
        res = segfunc(res,dat[a])
    else:
        res=segfunc(segfunc(res,dat[a]),dat[b])
    return res def query(a,b): #半開区間、[a,b)の最小値
    if b<=a:
        return inf
    res=inf
    a += num_min-1
    b += num_min-2
    while b-a>1:
        if a&1==0:
            res = segfunc(res,dat[a])
        if b&1==1:
            res = segfunc(res,dat[b])
            b-=1
        a=a//2
        b=(b-1)//2
    if a==b:
        res = segfunc(res,dat[a])
    else:
        res=segfunc(segfunc(res,dat[a]),dat[b])
    return res query n=int(input()) int(input()) n def update(i,x):
    i+=num_min-1
    dat[i]=x
    while i>0:
        i=(i-1)//2
        dat[i]=segfunc(dat[2*i+1],dat[2*i+2]) def update(i,x):
    i+=num_min-1
    dat[i]=x
    while i>0:
        i=(i-1)//2
        dat[i]=segfunc(dat[2*i+1],dat[2*i+2]) update l,r=input().split() input().split() l t,l,r=input().split() input().split() t q=int(input()) int(input()) q num_min =2**(n-1).bit_length() 2**(n-1).bit_length() num_min def segfunc(x,y):
    return x.union(y) def segfunc(x,y):
    return x.union(y) segfunc dat=[inf]*(2*num_min-1) [inf]*(2*num_min-1) dat r=input().split() input().split() r inf = set() set() inf ans=query(int(l)-1,int(r)) query(int(l)-1,int(r)) ans
#import sys
#import numpy as np
import math
#from fractions import Fraction
import itertools
from collections import deque
from collections import Counter
#import heapq
#from fractions  import gcd
#input=sys.stdin.readline
import bisect
n=int(input())
s=input()
q=int(input())

inf = set()
num_min =2**(n-1).bit_length()
dat=[inf]*(2*num_min-1)

#初期化
for i in range(n):
    dat[i+num_min-1]=set(s[i])
for i in range(num_min-2,-1,-1):
    dat[i]=dat[2*i+1].union(dat[2*i+2])

#親のノード(n-1)//2
#子のノード2n+1,2n+2

def segfunc(x,y):
    return x.union(y)

def update(i,x):
    i+=num_min-1
    dat[i]=x
    while i>0:
        i=(i-1)//2
        dat[i]=segfunc(dat[2*i+1],dat[2*i+2])
def query(a,b): #半開区間、[a,b)の最小値
    if b<=a:
        return inf
    res=inf
    a += num_min-1
    b += num_min-2
    while b-a>1:
        if a&1==0:
            res = segfunc(res,dat[a])
        if b&1==1:
            res = segfunc(res,dat[b])
            b-=1
        a=a//2
        b=(b-1)//2
    if a==b:
        res = segfunc(res,dat[a])
    else:
        res=segfunc(segfunc(res,dat[a]),dat[b])
    return res

for i in range(q):
  t,l,r=input().split()
  if t=="1":
    update(int(l)-1,set(r))
  else:
    ans=query(int(l)-1,int(r))
    print(len(ans))