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 C++14 (GCC 5.4.1) (judge verdict: Runtime Error)

//=======================================
//       セグメント木(総和ver.)
//=======================================

#include <bits/stdc++.h>
using namespace std;
const int SEG_LEN = 1<<25;

// 1-indexedのセグメント木
vector<int> seg(SEG_LEN, 0);

// id番目(1-indexed)の値をxに更新
void update(int id, int x){
    id += SEG_LEN; seg[id] = x;
    while(id > 0){
        id /= 2;
        seg[id] = seg[2*id] | seg[2*id+1];
    }
}

// 区間[l,r)に対するクエリ(総和)
int query(int l, int r){
    l += SEG_LEN; r += SEG_LEN;

    int res = 0;
    while(l < r){
        if(l % 2 == 1){ res = res | seg[l]; l++; }
        l /= 2;
        if(r % 2 == 1){ res = res | seg[r-1]; r--; }
        r /= 2;
    }
    return res;
}

int main(){
    int N, Q; string S;
    cin >> N >> S >> Q;

    for(int i=1; i<=S.length(); i++){
        update(i, 1<<(S[i-1]-'a'));
    }

    for(int q=0; q<Q; q++){
        int a; cin >> a;
        if(a == 1){
            int id; char ch; cin >> id >> ch;
            update(id, (1 << (ch-'a')));
        }
        if(a == 2){
            int l, r; cin >> l >> r;
            int res = query(l, r+1);

            int ans = 0;
            while(res > 0){
                ans += res & 1;
                res /= 2;
            }
            cout << ans << endl;
        }
    }
}