Submission #717860

#TimeUsernameProblemLanguageResultExecution timeMemory
717860Radin_Zahedi2Crossing (JOI21_crossing)C++17
100 / 100
521 ms26360 KiB
#include<bits/stdc++.h>
//#pragma GCC optimize("O2")
using namespace std;
using ll = long long;
using ld = long double;
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define sz(x) (int)x.size()
#define endl '\n'
const int mod = 1e9 + 7;
const int inf = 2e9 + 5;
const ll linf = 9e18 + 5;


int n;
const int N = 2e5 + 5;
const int L = (1 << 19);
const int possi[9][3] = {{1, 0, 0}, {0, 1, 0}, {0, 0, 1}, 
						{2, 2, 0}, {2, 0, 2}, {0, 2, 2}, 
						{2, 1, 1}, {1, 2, 1}, {1, 1, 2}};
bool seg[L][4][9];
int lazy[L];

string s[3];

int inted(char c) {
	if (c == 'J') {
		return 0;
	}
	if (c == 'O') {
		return 1;
	}
	if (c == 'I') {
		return 2;
	}

	return -1;
}

void applyind(int ind, int c) {
	for (int f = 0; f < 9; f++) {
		seg[ind][3][f] = seg[ind][c][f];
	}
	lazy[ind] = c;
}

void apply(int ind) {
	if (lazy[ind] != -1) {
		applyind(2 * ind, lazy[ind]);
		applyind(2 * ind + 1, lazy[ind]);

		lazy[ind] = -1;
	}
}

void cre(int l, int r, int ind) {
	if (l == r) {
		for (int f = 0; f < 9; f++) {
			int c = 0;

			for (int st = 0; st < 3; st++) {
				c += possi[f][st] * inted(s[st][l]);
			}

			seg[ind][c % 3][f] = true;
		}

		lazy[ind] = -1;

		return;
	}


	int m = (l + r) / 2;
	cre(l, m, 2 * ind);
	cre(m + 1, r, 2 * ind + 1);

	for (int c = 0; c < 4; c++) {
		for (int f = 0; f < 9; f++) {
			seg[ind][c][f] = (seg[2 * ind][c][f] && seg[2 * ind + 1][c][f]);
		}
	}

	lazy[ind] = -1;
}

void upd(int b, int e, int c, int l, int r, int ind) {
	if (b <= l && r <= e) {
		applyind(ind, c);

		return;
	}
	if (e < l || r < b) {
		return;
	}


	apply(ind);

	int m = (l + r) / 2;
	upd(b, e, c, l, m, 2 * ind);
	upd(b, e, c, m + 1, r, 2 * ind + 1);

	for (int f = 0; f < 9; f++) {
		seg[ind][3][f] = (seg[2 * ind][3][f] && seg[2 * ind + 1][3][f]);
	}
}

void answ() {
	for (int f = 0; f < 9; f++) {
		if (seg[1][3][f]) {
			cout << "Yes" << endl;
			return;
		}
	}

	cout << "No" << endl;
}

void init() {
}

void input() {
	cin >> n;

	cin >> s[0] >> s[1] >> s[2];
}

void solve() {
	cre(0, n - 1, 1);

	int q;
	cin >> q;

	string t;
	cin >> t;

	for (int i = 0; i < n; i++) {
		upd(i, i, inted(t[i]), 0, n - 1, 1);
	}

	answ();


	while (q--) {
		int b, e;
		char c;
		cin >> b >> e >> c;

		upd(b - 1, e - 1, inted(c), 0, n - 1, 1);

		answ();
	}
}

void output() {
}

int main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);

	int number_of_testcases = 1;
	//cin >> number_of_testcases;
	while (number_of_testcases--) {
		init();

		input();

		solve();

		output();
	}

	return 0;
}

#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...