Submission #799867

#TimeUsernameProblemLanguageResultExecution timeMemory
799867ymmCrossing (JOI21_crossing)C++17
100 / 100
181 ms20692 KiB
#include <bits/stdc++.h>
#define Loop(x,l,r) for (ll x = (l); x < (r); ++x)
typedef long long ll;
using namespace std;

const int N = 200'010;

namespace seg {
	struct node {
		int all[3];
		int eq;
		int lzy;
	} t[4*N];
	int constexpr cnts = 9;
	int sz = 0;

	int to_num(char c) {
		return (c == 'O') + 2*(c == 'I');
	}

	void init(const string s[cnts], const string &t0, int i, int b, int e) {
		if (e-b == 1) {
			Loop (c,0,3) {
				t[i].all[c] = 0;
				Loop (j,0,cnts)
					t[i].all[c] ^= (to_num(s[j][b]) == c) << j;
			}
			t[i].eq = 0;
			Loop (j,0,cnts)
				t[i].eq ^= (s[j][b] == t0[b]) << j;
			t[i].lzy = -1;
			return;
		}
		init(s, t0, 2*i+1, b, (b+e)/2);
		init(s, t0, 2*i+2, (b+e)/2, e);
		Loop (c,0,3)
			t[i].all[c] = t[2*i+1].all[c] & t[2*i+2].all[c];
		t[i].eq = t[2*i+1].eq & t[2*i+2].eq;
		t[i].lzy = -1;
	}
	void init(const string s[cnts], const string &t) {
		sz = t.size();
		init(s, t, 0, 0, sz);
	}

	void tag(int i, int x) {
		t[i].lzy = x;
		t[i].eq = t[i].all[x];
	}

	void ppg(int i) {
		if (t[i].lzy == -1)
			return;
		tag(2*i+1, t[i].lzy);
		tag(2*i+2, t[i].lzy);
		t[i].lzy = -1;
	}

	void up(int l, int r, int x, int i, int b, int e) {
		if (l <= b && e <= r)
			return tag(i, x);
		ppg(i);
		if (l < (b+e)/2)
			up(l, r, x, 2*i+1, b, (b+e)/2);
		if ((b+e)/2 < r)
			up(l, r, x, 2*i+2, (b+e)/2, e);
		t[i].eq = t[2*i+1].eq & t[2*i+2].eq;
	}
	void up(int l, int r, char c) { up(l, r, to_num(c), 0, 0, sz); }
}


string cross(string a, string b)
{
	string ans(a.size(), '\0');
	Loop (i,0,a.size()) {
		if (a[i] == b[i])
			ans[i] = a[i];
		else if ('J' != a[i] && 'J' != b[i])
			ans[i] = 'J';
		else if ('O' != a[i] && 'O' != b[i])
			ans[i] = 'O';
		else if ('I' != a[i] && 'I' != b[i])
			ans[i] = 'I';
	}
	return ans;
}

int main()
{
	cin.tie(0) -> sync_with_stdio(false);
	string a, b, c;
	int n;
	cin >> n >> a >> b >> c;
	vector<string> vec = {a, b, c, cross(a, b), cross(b, c), cross(c, a), cross(cross(a, b), c), cross(cross(b, c), a), cross(cross(c, a), b)};
	string t0;
	int q;
	cin >> q >> t0;
	seg::init(vec.data(), t0);
	cout << (seg::t[0].eq? "Yes\n": "No\n");
	while (q--) {
		int l, r;
		char c;
		cin >> l >> r >> c;
		--l;
		seg::up(l, r, c);
		cout << (seg::t[0].eq? "Yes\n": "No\n");
	}
}

Compilation message (stderr)

Main.cpp: In function 'std::string cross(std::string, std::string)':
Main.cpp:2:40: warning: comparison of integer expressions of different signedness: 'll' {aka 'long long int'} and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
    2 | #define Loop(x,l,r) for (ll x = (l); x < (r); ++x)
      |                                        ^
Main.cpp:76:2: note: in expansion of macro 'Loop'
   76 |  Loop (i,0,a.size()) {
      |  ^~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...