样例过了10pts求条
查看原帖
样例过了10pts求条
1365127
dendky楼主2025/6/15 22:54
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+5;
ll n, m;
struct node {
    ll l, r, w, lz;
}tree[N<<2];
void build(ll u, ll l, ll r) {
    tree[u].lz=0;
    tree[u].l=l, tree[u].r=r;
    if (l==r) return;
    ll mid=l+r>>1;
    build((u<<1)+1, mid+1, r), build(u<<1, l, mid);
    tree[u].w = tree[u<<1].w + tree[(u<<1)+1].w;
}
void maketag(ll u, ll l, ll r) {
    tree[u].w=r-l+1-tree[u].w;
    tree[u].lz^=1;
}
void update(ll u, ll l, ll r, ll L, ll R) {
    if (L>=l && R<=r) maketag(u, L, R);
    else if (L<l && R>r) return;
    else {
        ll mid=l+r>>1;
        maketag(u<<1, mid-l+1, tree[u].lz), maketag((u<<1)+1, r-mid, tree[u].lz);
        tree[u].lz=0;
        update(u<<1, l, mid, L, R), update((u<<1)+1, mid+1, r, L, R);
        tree[u].w = tree[u<<1].w + tree[(u<<1)+1].w;
    }
}
ll query(ll u, ll l, ll r, ll L, ll R) {
    if (L>=l && R<=r) return tree[u].w;
    else if (L<l && R>r) return 0;
    else {
        ll mid=l+r>>1;
        maketag(u<<1, mid-l+1, tree[u].lz), maketag((u<<1)+1, r-mid, tree[u].lz);
        tree[u].lz=0;
        return query(u<<1, l, mid, L, R) + query((u<<1)+1, mid+1, r, L, R);
    }
}
int main() {
    ios::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);
    cin>>n>>m;
    build(1, 1, n);
    while (m--) {
        ll opt, x, y;
        cin>>opt>>x>>y;
        if (opt==0) {
            update(1, 1, n, x, y);
        }else cout<<query(1, 1, n, x, y)<<"\n";
    }
    return 0;
}
2025/6/15 22:54
加载中...