Submission #959393

#TimeUsernameProblemLanguageResultExecution timeMemory
959393Alkaser_IDCrossing (JOI21_crossing)C++17
26 / 100
190 ms25004 KiB
#include <iostream>
#include <algorithm>
#include <vector>
#include <map>
#include <set>
#include <queue>
using namespace std;
typedef long long ll;
// second mod 998244353
const ll N = 3e5 + 5;

ll n; string s, t;
struct nd {
    ll o = 0, j = 0, i = 0;
    ll sm = 0;
} seg[3000006];
char lazy[3000006];
inline void upd(ll node, bool b) {
    if (lazy[node] == 'f') return;
    seg[node].sm = 0;
    char c = lazy[node];
    if (c == 'O') seg[node].sm = seg[node].o;
    if (c == 'J') seg[node].sm = seg[node].j;
    if (c == 'I') seg[node].sm = seg[node].i;
    if (b) {
        lazy[node * 2] = c;
        lazy[node * 2 + 1] = c;
    }
    lazy[node] = 'f';
}
inline void build(ll node, ll l, ll r) {
    lazy[node] = 'f';
    if (l == r) {
        if (s[l] == t[l]) seg[node].sm = 1;
        if (s[l] == 'O') ++seg[node].o;
        else if (s[l] == 'I') seg[node].i++;
        else seg[node].j++;
        return;
    }
    ll mid = (l + r) / 2;
    build(node * 2, l, mid);
    build(node * 2 + 1, mid + 1, r);
    seg[node].j = seg[node * 2].j + seg[node * 2 + 1].j;
    seg[node].o = seg[node * 2].o + seg[node * 2 + 1].o;
    seg[node].i = seg[node * 2].i + seg[node * 2 + 1].i;
    seg[node].sm = seg[node * 2].sm + seg[node * 2 + 1].sm;
}
inline void update(ll node, ll l, ll r, ll lx, ll rx, char c) {
    upd(node, (l != r));
    if (l >= lx && r <= rx) {
        lazy[node] = c;
        upd(node, (l != r));
        return;
    }
    else if (l > rx || r < lx) return;
    ll mid = (l + r) / 2;
    update(node * 2, l, mid, lx, rx, c);
    update(node * 2 + 1, mid + 1, r, lx, rx, c);
    seg[node].sm = seg[node * 2].sm + seg[node * 2 + 1].sm;
}
inline bool get() { return seg[1].sm == n; }
int main() {
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    string d;
    s = " "; t = " ";
    cin >> n >> d >> d >> d;
    s += d;
    ll q; cin >> q;
    cin >> d;
    t += d;
    build(1, 1, n);
    if (get()) cout << "Yes\n";
    else cout << "No\n";
    for (; q--;) {
        ll l, r; cin >> l >> r;
        char ch; cin >> ch;
        update(1, 1, n, l, r, ch);
        if (get()) cout << "Yes\n";
        else cout << "No\n";
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...