Problem:
Score : 500 points

Problem 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).

Constraints

N, Q, i_q, l_q, and r_q are integers.

S is a string consisting of lowercase English letters.

c_q is a lowercase English letter.

1 \leq N \leq 500000

1 \leq Q \leq 20000

|S| = N

1 \leq i_q \leq N

1 \leq l_q \leq r_q \leq N

There is at least one query of type 2 in each testcase.

Input

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

Output

For each query of type 2, print a line containing the answer.

Sample Input 1

7
abcdbbd
6
2 3 6
1 5 z
2 1 1
1 4 a
1 7 d
2 1 7

Sample Output 1

3
1
5

In the first query, cdbb contains three kinds of letters: b , c , and d, so we print 3.

In the second query, S is modified to abcdzbd.

In the third query, a contains one kind of letter: a, so we print 1.

In the fourth query, S is modified to abcazbd.

In the fifth query, S does not change and is still abcazbd.

In the sixth query, abcazbd contains five kinds of letters: a, b, c, d, and z, so we print 5.

Solution in Python (3.4.3) (judge verdict: Time Limit Exceeded)

class Segment_tree():
    def __init__(self, n, s):
        self.n = n
        self.s = s
        self.N = 1
        while self.N < self.n:
            self.N *= 2
        self.size = self.N * 2
        self.size -= 1
        self.N -= 1
        self.segment = [set()]*self.size
        for i in range(self.n):
            self.segment[i+self.N] = {self.s[i]}
        for i in range(self.N-1, -1, -1):
            a = self.segment[2*i+1] 
            b = self.segment[2*i+2]
            self.segment[i] = a|b
        
    def undate(self, i, x):
        i += (self.N-1)
        self.segment[i] = {x}
        while i > 0:
            i = (i-1)//2
            self.segment[i] = self.segment[2*i+1] | self.segment[2*i+2]
        
    def find(self, a, b, k, l, r):
        if r <= a or b <= l:
            return set()
        elif a <= l and r <= b:
            return self.segment[k]
        else:
            find_l = self.find(a, b, 2*k+1, l, (l+r)//2)
            find_r = self.find(a, b, 2*k+2, (l+r)//2, r)
            return find_l | find_r
    
    def count(self, a, b):
        return len(self.find(a, b, 0, 0, self.size-self.N))

n = int(input())
s = input()
segment_tree = Segment_tree(n, s)
q = int(input())
for i in range(q):
    key = [str(x) for x in input().split()]
    if key[0] == "1":
        segment_tree.undate(int(key[1]), key[2])
    else:
        print(segment_tree.count(int(key[1])-1, int(key[2])))