萌新初学线段树,莫名错误求教

P3870 [TJOI2009] 开关

@[Timing](/space/show?uid=130161) ```cpp #include<bits/stdc++.h> #define rt register int #define gt getchar() #define int long long using namespace std; inline void in(rt &x){ int f=1;char s=gt; while(!isdigit(s)){if(s=='-')f=-1;s=gt;} while(isdigit(s)){x=x*10+s-'0';s=gt;} x*=f; } const int _=1e5+10; int n,m; struct SegmentTree{ int l,r,sum,add; #define l(x) tree[x].l #define r(x) tree[x].r #define sum(x) tree[x].sum #define add(x) tree[x].add }tree[_<<2]; inline bool check(int p){ if(p==1)return 0; else return 1; } inline void build(int p,int l,int r){ l(p)=l,r(p)=r; if(l==r){sum(p)=0;return;} int mid=(l+r)>>1; build(p<<1,l,mid); build(p<<1+1,mid+1,r); // sum(p)=sum(p<<1)+sum(p<<1+1); return; } inline void spread(int p){ if(add(p))return; int f=p<<1; sum(f)=r(f)-l(f)+1-sum(f); sum(f+1)=r(f+1)-l(f+1)+1-sum(f+1); add(f+1)=check(add(f+1)); add(f)=check(add(f)); add(p)=0; return ; } inline void change(int p,int l,int r){ if(l<=l(p)&&r>=r(p)){ sum(p)=r(p)-l(p)+1-sum(p); add(p)=check(add(p)); return; } spread(p); int mid=(l(p)+r(p))>>1; if(l<=mid)change(p<<1,l,r); if(r>mid)change(p<<1+1,l,r); sum(p)=sum(p<<1)+sum(p<<1+1); return; } inline int ask(int p,int l,int r){ if(l<=l(p)&&r>=r(p))return sum(p); spread(p); int mid=(l(p)+r(p))>>1; int val=0ll; if(l<=mid)val+=ask(p<<1,l,r); if(r>mid)val+=ask(p<<1+1,l,r); return val; } signed main(){ in(n);in(m); build(1,1,n); while(m--){ rt c,l,r; in(c);in(l);in(r); if(c==0){ change(1,l,r); } else printf("%d\n",ask(1,l,r)); } return 0; } ```
by Timing @ 2019-03-10 20:06:41


```cpp 段错误 (核心已转储) ```
by t162 @ 2019-03-10 20:20:41


|