1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
| #include<iostream> #include<cstdio> using namespace std; int n,m,l,r,sum[3000000],cov[3000000]; void pushdown(int cur,int l,int r,int mid){ if (cov[cur]==2){ sum[cur<<1]=0; sum[cur<<1|1]=0; cov[cur<<1]=cov[cur]; cov[cur<<1|1]=cov[cur]; } if (cov[cur]==1){ sum[cur<<1]=mid-l+1; sum[cur<<1|1]=r-mid; cov[cur<<1]=cov[cur]; cov[cur<<1|1]=cov[cur]; } cov[cur]=0; } void update(int cur){ sum[cur]=sum[cur<<1]+sum[cur<<1|1]; } void add(int l,int r,int L,int R,int s,int cur){ if (l>=L && r<=R){ cov[cur]=s; sum[cur]=(s==1)?(r-l+1):sum[cur]; sum[cur]=(s==2)?0:sum[cur]; return; } int mid=(l+r)>>1; pushdown(cur,l,r,mid); if (L<=mid) add(l,mid,L,R,s,cur<<1); if (R>mid) add(mid+1,r,L,R,s,cur<<1|1); update(cur); } int main(){ scanf("%d%d",&n,&m); add(1,n,1,n,1,1); for (int i=1;i<=m;i++){ scanf("%d%d",&l,&r); add(1,n,l,r,2,1); printf("%d\n",sum[1]); } return 0; }
|