Submission

Status:
PPPPPPPPPPP

Score: 100

User: njoop

Problemset: เปิดไฟ

Language: cpp

Time: 0.175 second

Submitted On: 2024-11-27 20:40:15

#include <bits/stdc++.h>

using namespace std;

int n, q, in, m, c, s, e;

struct lzt {
    int seg[600010];
    bool lz[600010];

    void push(int l, int r, int node) {
        if(lz[node] == 1) {
            seg[node] = (r-l+1)-seg[node];
            if(l != r) {
                lz[node*2] = !lz[node*2];
                lz[node*2+1] = !lz[node*2+1];
            }
            lz[node] = 0;
        }
    }

    void update(int l, int r, int ul, int ur, int node) {
        push(l, r, node);
        if(l > ur || r < ul) return;
        if(l >= ul && r <= ur) {
            lz[node] = !lz[node];
            push(l, r, node);
            return;
        }
        int mid = (l+r)/2;
        update(l, mid, ul, ur, node*2);
        update(mid+1, r, ul, ur, node*2+1);
        seg[node] = seg[node*2] + seg[node*2+1];
    }

    int query(int l, int r, int ql, int qr, int node) {
        push(l, r, node);
        if(l > qr || r < ql) return 0;
        if(l >= ql && r <= qr) return seg[node];
        int mid = (l+r)/2;
        return query(l, mid, ql, qr, node*2) + query(mid+1, r, ql, qr, node*2+1);
    }
};

int main() {
    cin >> n >> m;
    lzt seg;
    while(m--) {
        cin >> c >> s >> e;
        if(c == 0) {
            seg.update(1, n, s, e, 1);
        } else {
            cout << seg.query(1, n, s, e, 1) << "\n";
        }
    }
    return 0;
}