#pragma GCC optimize ("Ofast")
#include<bits/stdc++.h>
using namespace std;
void *wmem;
char memarr[96000000];
template<class T> inline void walloc1d(T **arr, int x, void **mem = &wmem){
  static int skip[16] = {0, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1};
  (*mem) = (void*)( ((char*)(*mem)) + skip[((unsigned long long)(*mem)) & 15] );
  (*arr)=(T*)(*mem);
  (*mem)=((*arr)+x);
}
inline void rd(int &x){
  int k;
  int m=0;
  x=0;
  for(;;){
    k = getchar_unlocked();
    if(k=='-'){
      m=1;
      break;
    }
    if('0'<=k&&k<='9'){
      x=k-'0';
      break;
    }
  }
  for(;;){
    k = getchar_unlocked();
    if(k<'0'||k>'9'){
      break;
    }
    x=x*10+k-'0';
  }
  if(m){
    x=-x;
  }
}
inline void rd(char &c){
  int i;
  for(;;){
    i = getchar_unlocked();
    if(i!=' '&&i!='\n'&&i!='\r'&&i!='\t'&&i!=EOF){
      break;
    }
  }
  c = i;
}
inline int rd(char c[]){
  int i;
  int sz = 0;
  for(;;){
    i = getchar_unlocked();
    if(i!=' '&&i!='\n'&&i!='\r'&&i!='\t'&&i!=EOF){
      break;
    }
  }
  c[sz++] = i;
  for(;;){
    i = getchar_unlocked();
    if(i==' '||i=='\n'||i=='\r'||i=='\t'||i==EOF){
      break;
    }
    c[sz++] = i;
  }
  c[sz]='\0';
  return sz;
}
inline void wt_L(char a){
  putchar_unlocked(a);
}
inline void wt_L(int x){
  int s=0;
  int m=0;
  char f[10];
  if(x<0){
    m=1;
    x=-x;
  }
  while(x){
    f[s++]=x%10;
    x/=10;
  }
  if(!s){
    f[s++]=0;
  }
  if(m){
    putchar_unlocked('-');
  }
  while(s--){
    putchar_unlocked(f[s]+'0');
  }
}
template<class T> struct fenwick{
  int size;
  int memory;
  T *data;
  void malloc(int mem);
  void malloc(int mem, int fg);
  void walloc(int mem, void **workMemory = &wmem);
  void walloc(int mem, int fg, void **workMemory = &wmem);
  void free(void);
  void init(int N);
  void add(int k, T val);
  T get(int k);
  T range(int a, int b);
  int kth(T k);
}
;
int N;
int Q;
char S[500000+2];
int TYPE;
int I;
int L;
int R;
char C;
int main(){
  int FmcKpFmN, i;
  wmem = memarr;
  int res;
  fenwick<int> t[26];
  rd(N);
  rd(S);
  rd(Q);
  for(i=(0);i<(26);i++){
    t[i].malloc(N, 1);
  }
  for(i=(0);i<(N);i++){
    S[i] -= 'a';
  }
  for(i=(0);i<(N);i++){
    t[S[i]].add(i,1);
  }
  for(FmcKpFmN=(0);FmcKpFmN<(Q);FmcKpFmN++){
    rd(TYPE);
    if(TYPE==1){
      rd(I);I += (-1);
      rd(C);
      C -= 'a';
      if(S[I] != C){
        t[S[I]].add(I,-1);
        S[I] = C;
        t[S[I]].add(I,1);
      }
    }
    else{
      rd(L);L += (-1);
      rd(R);R += (-1);
      res = 0;
      for(i=(0);i<(26);i++){
        if(t[i].range(L,R)){
          res++;
        }
      }
      wt_L(res);
      wt_L('\n');
    }
  }
  return 0;
}
template<class T> void fenwick<T>::malloc(int mem){
  memory = mem;
  data = (T*)std::malloc(sizeof(T)*mem);
}
template<class T> void fenwick<T>::malloc(int mem, int fg){
  memory = mem;
  data = (T*)std::malloc(sizeof(T)*mem);
  if(fg){
    init(mem);
  }
}
template<class T> void fenwick<T>::walloc(int mem, void **workMemory /* = &wmem*/){
  memory = mem;
  walloc1d(&data, mem, workMemory);
}
template<class T> void fenwick<T>::walloc(int mem, int fg, void **workMemory /* = &wmem*/){
  memory = mem;
  walloc1d(&data, mem, workMemory);
  if(fg){
    init(mem);
  }
}
template<class T> void fenwick<T>::free(void){
  memory = 0;
  free(data);
}
template<class T> void fenwick<T>::init(int N){
  size = N;
  memset(data,0,sizeof(T)*N);
}
template<class T> void fenwick<T>::add(int k, T val){
  while(k < size){
    data[k] += val;
    k |= k+1;
  }
}
template<class T> T fenwick<T>::get(int k){
  T res = 0;
  while(k>=0){
    res += data[k];
    k = (k&(k+1))-1;
  }
  return res;
}
template<class T> T fenwick<T>::range(int a, int b){
  if(b==-1){
    b=size-1;
  }
  return get(b) - get(a-1);
}
template<class T> int fenwick<T>::kth(T k){
  int i=0;
  int j=size;
  int c;
  T v;
  while(i<j){
    c = (i+j)/2;
    v = get(c);
    if(v <= k){
      i=c+1;
    }
    else{
      j=c;
    }
  }
  return i==size?-1:i;
}
// cLay varsion 20200227-1

// --- original code ---
// int N, Q;
// char S[5d5+2];
// int TYPE, I, L, R;
// char C;
// {
//   int res;
//   fenwick<int> t[26];
// 
//   rd(N,S,Q);
//   rep(i,26) t[i].malloc(N, 1);
//   rep(i,N) S[i] -= 'a';
//   rep(i,N) t[S[i]].add(i,1);
// 
//   rep(Q){
//     rd(TYPE);
//     if(TYPE==1){
//       rd(I--, C);
//       C -= 'a';
//       if(S[I] != C){
//         t[S[I]].add(I,-1);
//         S[I] = C;
//         t[S[I]].add(I,1);
//       }
//     } else {
//       rd(L--, R--);
//       res = 0;
//       rep(i,26) if(t[i].range(L,R)) res++;
//       wt(res);
//     }
//   }
// }


Measured memory_bytes: 51584