#include<bits/stdc++.h>
using namespace std;
#define Mx 2000001
#define all(v) v.begin(), v.end()
#define fr first
#define sc second
#define mp make_pair
#define pb(a) push_back(a)
#define ___ ios_base::sync_with_stdio(false);cin.tie(NULL);

typedef long long  L;
#define paii pair<L, L>

typedef pair<L, L> pii;

L n,block,q,d,a1,a2;
L data[Mx],mapa[1000005],cnt[1000005],anss[100005];
vector< pair< pair<L,L> ,L> >temp;
paii update_no[Mx];
vector< pair< paii , paii > >query;
map<L,L>mm;
char str[Mx];
void Compression(){
    sort(all(temp));
    for(L i=0;i<temp.size();i++){
        if(temp[i].sc==0){
            L val=temp[i].fr.fr;
            if(mm[val]==0)
            {
                mm[val]=i+1;
            }
            data[temp[i].fr.sc]=mm[val];
            mapa[data[temp[i].fr.sc]]=val;
        }
        else
        {
            L val=temp[i].fr.fr;
            if(mm[val]==0)
            {
                mm[val]=i+1;
            }
            update_no[temp[i].fr.sc].sc=mm[val];
            mapa[update_no[temp[i].fr.sc].sc]=val;
        }
    }
}

bool comp(pair< paii , paii >x,pair< paii , paii >y)
{
    L p=x.fr.fr/block;
    L q=y.fr.fr/block;
    if(p==q){
        L pp=x.fr.sc/block;
        L qq=y.fr.sc/block;
        if(pp==qq){
            return x.sc.fr<y.sc.fr;
        }
        return x.fr.sc<y.fr.sc;
    }
    return x.fr.fr<y.fr.fr;
}

L ans;


void update(L i,L x,L y)
{
    L index=update_no[i].fr;
    L vv=update_no[i].sc;

    L old=data[index];
    data[index]=vv;
    update_no[i].sc=old;

    if(index>=x && index<=y)
    {
        L ager=mapa[old];
        L akn=mapa[vv];
        cnt[old]--;
        if(cnt[old]==0)
        {
            ans--;
        }
        cnt[vv]++;
        if(cnt[vv]==1)
        {
            ans++;
        }
    }
}


void Add(L i){
    L vv=data[i];
    L pp=mapa[vv];
    cnt[vv]++;
    if(cnt[vv]==1)
        ans++;
}

void Remove(L i){
    L vv=data[i];
    L pp=mapa[vv];
    cnt[vv]--;
    if(cnt[vv]==0)
        ans--;
}

int main()
{
    char ch;
    // scanf("%lld",&n);
    cin>>n;
    // scanf("%s",str);
    cin>>str;
    for(L i=0;i<n;i++){
        data[i+1]=(str[i]-'a'+1);
        temp.pb(mp(mp(data[i+1],i+1),0));
    }
    // scanf("%lld",&q);
    cin>>q;
    L cntt=0;
    for(L i=0;i<q;i++){
        // scanf("%lld",&d);
        cin>>d;
        if(d==1){
            // scanf("%lld",&a1);
            cin>>a1;
            // getchar();
            // scanf("%c",&ch);
            // cout<<"here"<<endl;
            cin>>ch;
            a2=ch-'a'+1;//cout<<"??"<<endl;
            update_no[++cntt]=mp(a1,a2);
            temp.pb(mp(mp(a2,cntt),1));
            // cout<<q<<" ?? !!!"<<endl;
        }else{
            // scanf("%lld%lld",&a1,&a2);
            cin>>a1>>a2;
            query.pb(mp(mp(a1,a2),mp(cntt,i)));
        }
    }
    Compression();

    block=sqrt(n);

    sort(all(query),comp);
    L lef=1,rt=0,update_tim=0;
    ans=0;
    memset(anss,-1,sizeof(anss));
    for(L i=0;i<query.size();i++){
        L x=query[i].fr.fr;
        L y=query[i].fr.sc;
        L tt=query[i].sc.fr;
        while(update_tim<tt)
        {
            update_tim++;
            update(update_tim,lef,rt);
        }
        while(update_tim>tt)
        {
            update(update_tim,lef,rt);
            update_tim--;
        }
        while(lef<x)
        {
            Remove(lef);
            lef++;
        }
        while(lef>x)
        {
            lef--;
            Add(lef);
        }
        while(rt<y)
        {
            rt++;
            Add(rt);
        }
        while(rt>y)
        {
            Remove(rt);
            rt--;
        }
        anss[query[i].sc.sc]=ans;
    }

    for(L i=0;i<q;i++){
        if(anss[i]==-1) continue;
        // printf("%lld\n",anss[i]);
        cout<<anss[i]<<endl;
    }
    return 0;
}
/// lld I64d push_back() top() pop() insert() upper_bound() lower_bound() memset() max() min() scanf continue


Measured memory_bytes: 34408