#include <bits/stdc++.h>
#define ll long long
#define ff first
#define ss second
#define inf INT_MAX
#define FOR(i, a, b) for (int i = (a); i < (b); i++)
#define FAR(i, a, b) for (int i = (a); i >= (b); i--)
#define v(x) (x.begin(), x.end())
#define pii pair<int, int>
const int MOD = 1e9 + 7;
using namespace std;
struct T
{
string a;
vector<int> rr;
int n, cc;
set<pair<pii, char>> st;
void init(string as, string b)
{
a = as;
n = (int)a.size();
cc = 0;
for (int i = 0; i < n; i++)
{
st.insert({{i, i}, b[i]});
cc += (b[i] != a[i]);
}
rr.resize(n);
int i = 0;
while (i < n)
{
int j = i;
while (j < n && a[i] == a[j])
j++;
j--;
while (i <= j)
rr[i++] = j;
}
}
bool val(int l, int r, char x)
{
return (rr[l] >= r && a[l] == x);
}
void upd(int l, int r, char x)
{
auto it = st.lower_bound({{l + 1, 0}, 0});
it--;
auto [p, y] = (*it);
if (p.ff < l)
{
cc -= !val(p.ff, p.ss, y);
st.erase(it);
st.insert({{p.ff, l - 1}, y});
st.insert({{l, p.ss}, y});
cc += !val(p.ff, l - 1, y);
cc += !val(l, p.ss, y);
}
it = st.upper_bound({{r + 1, 0}, 0});
it--;
p = (*it).ff;
y = (*it).ss;
if (r < p.ss)
{
cc -= !val(p.ff, p.ss, y);
st.erase(it);
st.insert({{p.ff, r}, y});
st.insert({{r + 1, p.ss}, y});
cc += !val(p.ff, r, y);
cc += !val(r + 1, p.ss, y);
}
while (1)
{
it = st.lower_bound({{l, 0}, 0});
if (it == st.end() || (*it).ff.ff > r)
break;
auto [p, y] = (*it);
cc -= !val(p.ff, p.ss, y);
st.erase(it);
}
st.insert({{l, r}, x});
cc += !val(l, r, x);
}
bool get()
{
return !cc;
}
};
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int n;
cin >> n;
string a, b, c;
cin >> a >> b >> c;
vector<char> MOI = {'J', 'O', 'I'};
auto f = [&](string x, string y)
{
string t;
for (int i = 0; i < n; i++)
{
if (x[i] == y[i])
{
t += x[i];
continue;
}
for (char s : MOI)
{
if (s != x[i] && s != y[i])
{
t += s;
break;
}
}
}
return t;
};
vector<string> all = {a, b, c, f(a, b), f(b, c), f(a, c), f(f(a, b), c), f(f(b, c), a), f(f(a, c), b)};
int q;
cin >> q;
string t;
cin >> t;
T T[9];
for (int i = 0; i < 9; i++)
T[i].init(all[i], t);
auto check = [&](string s)
{
for (int i = 0; i < 9; i++)
{
if (T[i].get())
{
cout << "Yes" << "\n";
return;
}
}
cout << "No" << "\n";
return;
};
check(t);
while (q--)
{
int l, r;
char c;
cin >> l >> r >> c;
l--;
r--;
for (int i = 0; i < 9; i++)
T[i].upd(l, r, c);
check(t);
}
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |