#include <bits/stdc++.h>


using namespace std;
typedef long long ll;

#define REP(i,n) for(int i=0; i<int(n); i++)
#define FOR(i,m,n) for(int i=int(m); i<int(n); i++)
#define ALL(obj) (obj).begin(),(obj).end()
#define VI vector<int>
#define VP vector<pair<int,int>>
#define VPP vector<pair<int,pair<int,int>>>
#define VLL vector<long long>
#define VVI vector<vector<int>>
#define VVLL vector<vector<long long>>
#define VC vector<char>
#define VS vector<string>
#define VVC vector<vector<char>>
#define VB vector<bool>
#define VVB vector<vector<bool>>
#define fore(i,a) for(auto &i:a)
typedef pair <int, int> P;
template<typename T> using min_priority_queue = priority_queue<T, vector<T>, greater<T>>;

const int  INF = 1 << 29;
const ll INFL = 1LL << 60;
const ll mod = 1000000007;


struct Segment_tree {
	using T = ll;

	int n;
	vector<T> data;
	const T out = (1LL << 31) - 1;

	inline T vmerge(T l, T r) { return min(l, r); }

	Segment_tree(int n) :n(n) { data.assign(2 * n, out); }

	void update(int p, T x) {  // set value at position p
		for (data[p += n] = x; p > 1; p >>= 1) {
			data[p >> 1] = vmerge(data[p], data[p ^ 1]);
		}
	}

	T query(int l, int r) {  // sum on interval [l, r)
		T resl = out, resr = out;
		for (l += n, r += n; l < r; l >>= 1, r >>= 1) {
			if (l & 1) resl = vmerge(data[l++], resl);
			if (r & 1) resr = vmerge(resr, data[--r]);
		}
		return vmerge(resl, resr);
	}
};



int main() {
	

	int n, q;
	string s;

	cin >> n >> s >> q;
	Segment_tree s0(n);
	Segment_tree s1(n);
	Segment_tree s2(n);
	Segment_tree s3(n);
	Segment_tree s4(n);
	Segment_tree s5(n);
	Segment_tree s6(n);
	Segment_tree s7(n);
	Segment_tree s8(n);
	Segment_tree s9(n);
	Segment_tree s10(n);
	Segment_tree s11(n);
	Segment_tree s12(n);
	Segment_tree s13(n);
	Segment_tree s14(n);
	Segment_tree s15(n);
	Segment_tree s16(n);
	Segment_tree s17(n);
	Segment_tree s18(n);
	Segment_tree s19(n);
	Segment_tree s20(n);
	Segment_tree s21(n);
	Segment_tree s22(n);
	Segment_tree s23(n);
	Segment_tree s24(n);
	Segment_tree s25(n);
	
	REP(i, n) {
		int a = s[i] - 'a';
		if (a == 0) s0.update(i, 1);
		else if (a == 1)s1.update(i, 1);
		else if (a == 2)s2.update(i, 1);
		else if (a == 3)s3.update(i, 1);
		else if (a == 4)s4.update(i, 1);
		else if (a == 5)s5.update(i, 1);
		else if (a == 6)s6.update(i, 1);
		else if (a == 7)s7.update(i, 1);
		else if (a == 8)s8.update(i, 1);
		else if (a == 9)s9.update(i, 1);
		else if (a == 10)s10.update(i, 1);
		else if (a == 11)s11.update(i, 1);
		else if (a == 12)s12.update(i, 1);
		else if (a == 13)s13.update(i, 1);
		else if (a == 14)s14.update(i, 1);
		else if (a == 15)s15.update(i, 1);
		else if (a == 16)s16.update(i, 1);
		else if (a == 17)s17.update(i, 1);
		else if (a == 18)s18.update(i, 1);
		else if (a == 19)s19.update(i, 1);
		else if (a == 20)s20.update(i, 1);
		else if (a == 21)s21.update(i, 1);
		else if (a == 22)s22.update(i, 1);
		else if (a == 23)s23.update(i, 1);
		else if (a == 24)s24.update(i, 1);
		else if (a == 25)s25.update(i, 1);
	}

	REP(_, q) {
		int a;
		cin >> a;
		if (a == 1) {
			int l;
			char c;
			cin >> l >> c;
			l--;
			int a = c - 'a';
			s0.update(l, 100);
			s1.update(l, 100);
			s1.update(l, 100);
			s2.update(l, 100);
			s3.update(l, 100);
			s4.update(l, 100);
			s5.update(l, 100);
			s6.update(l, 100);
			s7.update(l, 100);
			s8.update(l, 100);
			s9.update(l, 100);
			s10.update(l, 100);
			s11.update(l, 100);
			s12.update(l, 100);
			s13.update(l, 100);
			s14.update(l, 100);
			s15.update(l, 100);
			s16.update(l, 100);
			s17.update(l, 100);
			s18.update(l, 100);
			s19.update(l, 100);
			s20.update(l, 100);
			s21.update(l, 100);
			s22.update(l, 100);
			s23.update(l, 100);
			s24.update(l, 100);
			s25.update(l, 100);

			if (a == 0) s0.update(l, 1);
			else if (a == 1)s1.update(l, 1);
			else if (a == 2)s2.update(l, 1);
			else if (a == 3)s3.update(l, 1);
			else if (a == 4)s4.update(l, 1);
			else if (a == 5)s5.update(l, 1);
			else if (a == 6)s6.update(l, 1);
			else if (a == 7)s7.update(l, 1);
			else if (a == 8)s8.update(l, 1);
			else if (a == 9)s9.update(l, 1);
			else if (a == 10)s10.update(l, 1);
			else if (a == 11)s11.update(l, 1);
			else if (a == 12)s12.update(l, 1);
			else if (a == 13)s13.update(l, 1);
			else if (a == 14)s14.update(l, 1);
			else if (a == 15)s15.update(l, 1);
			else if (a == 16)s16.update(l, 1);
			else if (a == 17)s17.update(l, 1);
			else if (a == 18)s18.update(l, 1);
			else if (a == 19)s19.update(l, 1);
			else if (a == 20)s20.update(l, 1);
			else if (a == 21)s21.update(l, 1);
			else if (a == 22)s22.update(l, 1);
			else if (a == 23)s23.update(l, 1);
			else if (a == 24)s24.update(l, 1);
			else if (a == 25)s25.update(l, 1);

		}
		else {
			int l, r;
			cin >> l >> r;
			l--;
			
			int cnt = 0;
			if (s0.query(l, r) == 1)cnt++;
			if (s1.query(l, r) == 1)cnt++;
			if (s2.query(l, r) == 1)cnt++;
			if (s3.query(l, r) == 1)cnt++;
			if (s4.query(l, r) == 1)cnt++;
			if (s5.query(l, r) == 1)cnt++;
			if (s6.query(l, r) == 1)cnt++;
			if (s7.query(l, r) == 1)cnt++;
			if (s8.query(l, r) == 1)cnt++;
			if (s9.query(l, r) == 1)cnt++;
			if (s10.query(l, r) == 1)cnt++;
			if (s11.query(l, r) == 1)cnt++;
			if (s12.query(l, r) == 1)cnt++;
			if (s13.query(l, r) == 1)cnt++;
			if (s14.query(l, r) == 1)cnt++;
			if (s15.query(l, r) == 1)cnt++;
			if (s16.query(l, r) == 1)cnt++;
			if (s17.query(l, r) == 1)cnt++;
			if (s18.query(l, r) == 1)cnt++;
			if (s19.query(l, r) == 1)cnt++;
			if (s20.query(l, r) == 1)cnt++;
			if (s21.query(l, r) == 1)cnt++;
			if (s22.query(l, r) == 1)cnt++;
			if (s23.query(l, r) == 1)cnt++;
			if (s24.query(l, r) == 1)cnt++;
			if (s25.query(l, r) == 1)cnt++;
			cout << cnt << endl;

		}


	}


}

Measured memory_bytes: 206212