#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

struct query{
  int type;
  ll value;
  query(int a=0,ll b=0):type(a),value(b){}
};

#define SZ (1<<17)
struct segtree{
  query s[SZ*2];
  ll t[SZ*2],u[SZ*2];

  void init(){
    for(int i=0;i<SZ*2;i++){
      s[i]=query();
      t[i]=u[i]=0;
    }
  }
  
  void func(int k,int l,int r,query q){
    if(q.type==1){
      if(s[k].type==0)s[k]=q;
      else s[k].value+=q.value;
    }
    if(q.type==2){
      s[k]=q;
      t[k]=q.value*(r-l);
      u[k]=q.value;
    }
  }

  void compute(int k,int l,int r){
    query q=s[k];
    s[k]=query();
    if(q.type==0||r-l==1)return;
    int m=(l+r)/2;
    func(k*2+1,l,m,q);
    func(k*2+2,m,r,q);
  }

  void Update(int a,int b,query x,int k=0,int l=0,int r=SZ){
    if(b<=l || r<=a)return;
    compute(k,l,r);
    if(a<=l && r<=b){
      func(k,l,r,x);
    }else{
      int m=(l+r)/2;
      Update(a,b,x,k*2+1,l,m);
      Update(a,b,x,k*2+2,m,r);
      t[k]=t[k*2+1]+t[k*2+2];
      u[k]=min(u[k*2+1],u[k*2+2]);
    }
  }

  ll Getsum(int a,int b,int k=0,int l=0,int r=SZ){
    if(b<=l || r<=a)return 0;
    compute(k,l,r);
    if(a<=l && r<=b){
      return t[k];
    }else{
      int m=(l+r)/2;
      ll lv=Getsum(a,b,k*2+1,l,m);
      ll rv=Getsum(a,b,k*2+2,m,r);
      return lv+rv;
    }
  }
};


segtree T,U;
int N;
char str[100005];
int A[100005];

int main(){
  
  scanf("%d",&N);
  scanf("%s",str);

  for(int i=0;i<N;i++)    A[i]=str[i]-'0';


  
  for(int i=0;i<N;i++){
    T.Update(i,i+1,query(2,A[i]));
    if(i+1<N){
      U.Update(i,i+1,query(2,A[i]*A[i+1]));
    }
  }
  int Q;
  scanf("%d",&Q);
  while(Q--){

    
    int l,r,x;
    scanf("%d %d %d",&l,&r,&x);
    l--;
    
    T.Update(l,r, query(2,x));




    if(r-l>1){
      U.Update(l,r-1,query(2,x));
    }



    if(l-1>=0){
      U.Update(l-1,l,query(2,0));


      if(T.Getsum(l-1,l) * T.Getsum(l,l+1) == 1 ){


        U.Update(l-1,l,query(2,1));
      }

      //                  cout<<l<<' '<<r<<' '<<x<<endl;            
    }
    

    
    if(r+1<=N){
      U.Update(r-1,r,query(2,0));
      if(T.Getsum(r-1,r)*T.Getsum(r,r+1) == 1 ){
        U.Update(r-1,r,query(2,1));
      }
    }

    //    cout<<endl;
    printf("%lld\n",T.Getsum(0,SZ)-U.Getsum(0,SZ));
    /*
    for(int i=0;i<N;i++)cout<<T.Getsum(i,i+1);
    cout<<endl;

    for(int i=0;i<N;i++)cout<<U.Getsum(i,i+1);
    cout<<endl;
    */
  }
  return 0;
}