Submission

Status:

PPPPPPPPPPP

Score: 100

User: Pianist

Problemset: เปิดไฟ

Language: cpp

Time: 0.144 second

Submitted On: 2024-11-07 21:46:34

#include <bits/stdc++.h>
using namespace std;
const int MAX = 4e5+1;

int tree[MAX];
bool lazy[MAX];

void toggle(int node, int st, int en, int us, int ue) {
    if (lazy[node]) {
        lazy[node] = false;
        tree[node] = en - st + 1 - tree[node];
        if (st < en) {
            lazy[node << 1] = !lazy[node << 1];
            lazy[1 + (node << 1)] = !lazy[1 + (node << 1)];
        }
    }
    if (st > en || us > en || ue < st)
        return;
    if (us <= st && en <= ue) {
        tree[node] = en - st + 1 - tree[node];
        if (st < en) {
            lazy[node << 1] = !lazy[node << 1];
            lazy[1 + (node << 1)] = !lazy[1 + (node << 1)];
        }
        return;
    }
    int mid = (st + en) / 2;
    toggle((node << 1), st, mid, us, ue);
    toggle((node << 1) + 1, mid + 1, en, us, ue);
    if (st < en)
        tree[node] = tree[node << 1] + tree[(node << 1) + 1];
}

int countQuery(int node, int st, int en, int qs, int qe) {
    if (st > en || qs > en || qe < st)
        return 0;
    if (lazy[node]) {
        lazy[node] = false;
        tree[node] = en - st + 1 - tree[node];
        if (st < en) {
            lazy[node << 1] = !lazy[node << 1];
            lazy[(node << 1) + 1] = !lazy[(node << 1) + 1];
        }
    }
    if (qs <= st && en <= qe)
        return tree[node];
    int mid = (st + en) / 2;
    return countQuery((node << 1), st, mid, qs, qe) +
           countQuery((node << 1) + 1, mid + 1, en, qs, qe);
}

int main() {
    cin.tie(nullptr)->sync_with_stdio(false);
    int n;
    cin >> n;
    int q;
    cin >> q;
    while (q--) {
        int op, l, r;
        cin >> op >> l >> r;
        --l, --r;
        if (op) {
            cout << countQuery(1, 0, n - 1, l, r) << endl;
        } else {
            toggle(1, 0, n - 1, l, r);
        }
    }
    return 0;
}