Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- #define topper top //XDDDDDDD
- #define mp make_pair
- #define pb push_back
- #define db(x) cerr << #x << " == " << x << endl;
- #define _ << " " <<
- typedef long long ll;
- typedef vector<int> vi;
- typedef pair<int,int> ii;
- const long double EPS = 1e-9;
- const int N=1e5+5;
- const int MOD=1e9+7;
- const int INF=0x3f3f3f3f;
- int st[4*N], lz[4*N];
- int n, m;
- void build(int p, int l, int r) {
- if (l == r) { st[p] = 0; return; }
- build(2*p, l, (l+r)/2);
- build(2*p+1, (l+r)/2+1, r);
- st[p] = st[2*p] + st[2*p+1];
- }
- void push(int p, int l, int r) {
- if (lz[p]) {
- st[p] = r-l+1-st[p];
- if(l!=r) lz[2*p] = lz[2*p+1] = lz[p];
- lz[p] = 0;
- }
- }
- int query(int p, int l, int r, int i, int j) {
- if (r < i or l > j) return 0;
- push(p, l, r);
- if (l >= i and r <= j) return st[p];
- return query(2*p, l, (l+r)/2, i, j) +
- query(2*p+1, (l+r)/2+1, r, i, j);
- }
- void update(int p, int l, int r, int i, int j) {
- if (r < i or l > j) return;
- push(p, l, r);
- if (l >= i and r <= j) { lz[p] ^= 1 ; push(p, l, r); return; }
- update(2*p, l, (l+r)/2, i, j);
- update(2*p+1, (l+r)/2+1, r, i, j);
- st[p] = st[2*p] + st[2*p+1];
- }
- int main(){
- scanf("%d %d", &n, &m);
- build(1, 1, n);
- for(int i=0; i<m; i++) {
- int t, l, r;
- scanf("%d %d %d", &t, &l, &r);
- if(!t) update(1, 1, n, l, r);
- else printf("%d\n", query(1, 1, n, l, r));
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement