#include "bits/stdc++.h"
#include<unordered_map>
#include<unordered_set>
#pragma warning(disable:4996)
using namespace std;


struct Value1 {
	int f;
	int g;
	int l;
	int r;
};
typedef int Value2;
const Value1 Zero{ 0,0,0,0 };

struct Node {
	Value1 sum;//??´??°????????????. ?????????????????§??????????????????????????¨????????????????????????????????????.
	Value2 lazy;	//?????¶???????????????????????????????????????
	Node() :sum(Zero) {
		lazy = 0;
	}
};
struct lazy_segtree {
	int N;
	vector<Node>dat;
	lazy_segtree(int n) :N(1) {
		while (N < n) N *= 2;
		dat.resize(2 * N);
	}

	void lazy_func(const int k, const int a, const int b) {
		//dat[k].sum += dat[k].lazy * (b - a + 1);
		
		dat[k].sum = 
			dat[k].lazy == 1 ? Value1{ b - a + 1,max(0,b - a),1,1 }:
			dat[k].lazy == -1 ? Value1{ 0,0,0,0 }:
			dat[k].sum;
	}

	Value1 connect(const Value1 l, const Value1 r) {
		//dat[k].sum = dat[2 * k].sum + dat[2 * k + 1].sum;
		Value1 v{ l.f + r.f,max(0,l.g + r.g + l.r*r.l),l.l,r.r };
		return v;
	}

	// inline??????????????¨??§???????????¨????????????!(??????)
	inline void lazy_evaluate_node(int k, int a, int b) {
		lazy_func(k, a, b);
		if (k < N) { // 2*k(???????????????) < 2*N (???????????°) ?????????????????§. ???????????????????????????????????¬???????????¨??????.
			if (dat[k].lazy) {
				dat[2 * k].lazy = dat[k].lazy;	//?¬???????????????¬??????????????£?????????.
				dat[2 * k + 1].lazy = dat[k].lazy;
			}
		}
		dat[k].lazy = 0;
	}

	inline void update_node(int k) { // k???????????¢?????????????????????????????¨?????????. ????????\????????¨????????????????????????????????????????????????????????§if???????????????.
		dat[k].sum = connect(dat[2 * k].sum, dat[2 * k + 1].sum);

	}

	// update(l,r,v) := [l,r]?????´??°??????. ?????????1-indexed.
	void update(int l, int r, Value2 v, int k = 1, int a = 1, int b = -1) {
		if (b == -1)b = N;
		if (l < 0 || r<0)assert(false);
		lazy_evaluate_node(k, a, b); 	// ??¨?????????????????£???????????????????????????????????§?????¬?????¨???????\?.

		if (b < l || r < a) //[a,b]??¨[l,r]???????????????????????´???
			return;
		if (l <= a && b <= r) { // [l,r]???[a,b]????????¨???????????§????????´???
			dat[k].lazy = v;
			lazy_evaluate_node(k, a, b); //???????????¶???????????¨???????????¨?????????????????§.
			return;
		}

		int m = (a + b) / 2;
		update(l, r, v, 2 * k, a, m);
		update(l, r, v, 2 * k + 1, m + 1, b);
		update_node(k);
	}

	// get(l,r) := [l,r]?????????????????¨?????????????????????. ?????????1-indexed.
	Value1 get(int l, int r, int k = 1, int a = 1, int b = -1) {
		if (b == -1)b = N;

		if (l < 0 || r<0)assert(false);
		lazy_evaluate_node(k, a, b); // ??¨?????????????????£???????????????????????????????????§?????¬?????¨???????\?.

		if (b < l || r < a) //[a,b]??¨[l,r]???????????????????????´???
			return Zero;

		if (l <= a && b <= r) { // [l,r]???[a,b]????????¨???????????§????????´???
			return dat[k].sum;
		}

		int m = (a + b) / 2;
		Value1 vl = get(l, r, 2 * k, a, m);
		Value1 vr = get(l, r, 2 * k + 1, m + 1, b);
		update_node(k);
		return connect(vl, vr);
	}
};

int main() {
	int N; cin >> N;
	string x; cin >> x;
	int Q; cin >> Q;
	lazy_segtree tree(x.size());
	for (int i = 0; i < x.size();++i){
		tree.update(i + 1, i + 1, x[i]=='1'?1:-1);
	}
	while (Q--) {
		int l, r, b; cin >> l >> r >> b;
		tree.update(l, r, b==1?1:-1);
		auto t=tree.get(1, x.size());
		int ans = t.f - t.g;
		cout << ans << endl;
	}
	return 0;
}

Measured memory_bytes: 8188