output_description: For each query of type 2, print a line containing the answer.
  
  * * *
input_description: Input is given from Standard Input in the following format:
  
      
      
      N
      S
      Q
      Query_1
      \vdots
      Query_Q
      
  
  Here, Query_i in the 4-th through (Q+3)-th lines is one of the following:
  
      
      
      1 i_q c_q
      
      
      
      2 l_q r_q
attempt: n = int(input())
  s = input()
  
  # 初期化
  ind = 1
  while 2**ind <= n:
      ind += 1
  s += "*" * (2**ind - n)
  seg = []
  seg2 = []
  
  from collections import deque
  
  tmp = deque([s])
  while len(tmp) > 0:
      t = tmp.popleft()
      cnt = 0
      for ss in t:
          if ss != "*":
              cnt = cnt | 2 ** (ord(ss) - 97)
      seg.append(cnt)
      seg2.append(t)
      if len(t) > 1:
          tmp.append(t[: len(t) // 2])
          tmp.append(t[len(t) // 2 :])
  
  # セグ木が出来た！
  # print(seg)
  # print(seg2)
  
  q = int(input())
  
  
  def change(i, s):
      # i文字目をsに変更する
      # nの親は(n-1)//2
      # nの子は2n+1,2n+2
      global n, seg, ind
      ii = len(seg) - 2**ind + i - 1
      seg[ii] = 2 ** (ord(s) - 97)
      p = (ii - 1) // 2
      while 1:
          seg[p] = seg[2 * p + 1] | seg[2 * p + 2]
          if p == 0:
              break
          p = (p - 1) // 2
  
      # print(seg)
  
  
  from collections import deque
  
  
  def count(l, r):
      global n, seg, s
      # nの親は(n-1)//2
      # nの子は2n+1,2n+2
  
      d = deque([(1, len(s), 0)])
      ans = 0
  
      while len(d) > 0:
          tmp = d.popleft()
          # print(tmp)
          ll, rr, i = tmp[0], tmp[1], tmp[2]
          if l <= ll and rr <= r:
              ans = ans | seg[i]
          elif (ll <= l and l <= rr) or (ll <= r and r <= rr):
              d.append((ll, ll + (rr - ll) // 2, 2 * i + 1))
              d.append((ll + (rr - ll) // 2 + 1, rr, 2 * i + 2))
  
      return str(bin(ans)).count("1")
  
  
  result = []
  
  
  for _ in range(q):
      b, i, c = map(str, input().split())
      if b == "1":
          # i文字目をcに変更
          change(int(i), c)
      else:
          # l文字目からr文字目までに含まれる数
          result.append(count(int(i), int(c)))
  
  for item in result:
      print(item)
  
problem_description: Statement
  
  You are given a string S of length N consisting of lowercase English letters.
  
  Process Q queries of the following two types:
  
    * Type 1: change the i_q-th character of S to c_q. (Do nothing if the i_q-th character is already c_q.)
    * Type 2: answer the number of different characters occurring in the substring of S between the l_q-th and r_q-th characters (inclusive).
samples: [{"input": "7\n    abcdbbd\n    6\n    2 3 6\n    1 5 z\n    2 1 1\n    1 4 a\n    1 7 d\n    2 1 7", "output": "3\n    1\n    5\n    \n\nIn the first query, `cdbb` contains three kinds of letters: `b` , `c` , and\n`d`, so we print 3.\n\nIn the second query, S is modified to `abcdzbd`.\n\nIn the third query, `a` contains one kind of letter: `a`, so we print 1.\n\nIn the fourth query, S is modified to `abcazbd`.\n\nIn the fifth query, S does not change and is still `abcazbd`.\n\nIn the sixth query, `abcazbd` contains five kinds of letters: `a`, `b`, `c`,\n`d`, and `z`, so we print 5."}]