#include <stdio.h> #define N 300010 int a[N/3]; struct Tree { int a,b; int lval,rval,mval,sum; int cov() { if ( dis()==mval) return 2;//全是1 if ( mval==0 ) return 1;//全是0 return 0;//混乱 } void prs(int flag) { lval=rval=mval=sum= flag? dis():0;// flag=1 全改成1, flag=0 全改成0 } int dis() { return b-a+1; } int mid() { return (a+b)>>1; } }t[N]; int fmax(int a,int b) { return a>b? a:b; } int fmax3(int a,int b,int c) { return fmax(fmax(a,b),c); } int fmin(int a,int b) { return a<b? a:b; } void make(int x,int y,int n=1) { t[n].a=x; t[n].b=y; if (x==y) { t[n].prs(a[x]); return; } int mid=t[n].mid(); int LL=n<<1,RR=LL|1; make(x,mid,LL); make(mid+1,y,RR); t[n].sum=t[LL].sum+t[RR].sum; t[n].lval=t[LL].lval+(t[LL].cov()==2? t[RR].lval:0 ); t[n].rval=t[RR].rval+(t[RR].cov()==2? t[LL].rval:0 ); t[n].mval=fmax3(t[LL].rval+t[RR].lval,t[LL].mval,t[RR].mval); } void mod(int x,int y,int flag,int n=1) { if (x<=t[n].a && t[n].b<=y) { t[n].prs(flag); return; } int mid=t[n].mid(); int LL=n<<1,RR=LL|1; int temp=t[n].cov(); if(temp)//延迟处理 { t[LL].prs(temp-1); t[RR].prs(temp-1); } if (y<=mid) mod(x,y,flag,LL); else if (x>mid) mod(x,y,flag,RR); else { mod(x,y,flag,LL); mod(x,y,flag,RR); } t[n].sum=t[LL].sum+t[RR].sum; t[n].lval=t[LL].lval+(t[LL].cov()==2? t[RR].lval:0 ); t[n].rval=t[RR].rval+(t[RR].cov()==2? t[LL].rval:0 ); t[n].mval=fmax3(t[LL].rval+t[RR].lval,t[LL].mval,t[RR].mval); } int que_sum(int x,int y,int n=1) { if (x<=t[n].a && t[n].b<=y) return t[n].sum;//a——b 被 x——y 包含 int flag=t[n].cov(); if (flag)//a——b被cov { if(flag==1) return 0; int min=fmax(x,t[n].a); int max=fmin(y,t[n].b); return max-min+1; } int LL=n<<1,RR=LL|1; int mid=t[n].mid(); if (y<=mid) return que_sum(x,y,LL); else if (x>mid) return que_sum(x,y,RR); else { return que_sum(x,y,LL)+que_sum(x,y,RR); } } int que_val(int x,int y,int n=1) { if (x<=t[n].a && t[n].b<=y) return t[n].mval; int flag=t[n].cov(); if (flag)//a——b被cov { if (flag==1) return 0; int min=fmax(x,t[n].a); int max=fmin(y,t[n].b); return max-min+1; } int LL=n<<1,RR=LL|1; int mid=t[n].mid(); if (y<=mid) return que_val(x,y,LL); else if (x>mid) return que_val(x,y,RR); else { int lmin=fmin(t[LL].rval,mid-x+1);//左子树的rval 和 x到t[n].b的距离的较小值 int rmin=fmin(t[RR].lval,y-mid); return fmax3(que_val(x,y,LL),que_val(x,y,RR),lmin+rmin); } } void rev(int x,int y,int n=1) { int flag=t[n].cov(); if (x<=t[n].a && t[n].b<=y && flag )//rev只有到 区间覆盖 并且值cov才能停止 { t[n].prs(2-flag);//反转 仍然cov return; } int LL=n<<1,RR=LL|1; int mid=t[n].mid(); if(flag)//延迟处理 { t[LL].prs(flag-1); t[RR].prs(flag-1); } if(y<=mid) rev(x,y,LL); else if (x>mid) rev(x,y,RR); else { rev(x,y,LL); rev(x,y,RR); } t[n].sum=t[LL].sum+t[RR].sum; t[n].lval=t[LL].lval+(t[LL].cov()==2? t[RR].lval:0 ); t[n].rval=t[RR].rval+(t[RR].cov()==2? t[LL].rval:0 ); t[n].mval=fmax3(t[LL].rval+t[RR].lval,t[LL].mval,t[RR].mval); } int main () { int T,n,m,x,y,flag,i; scanf("%d",&T); while(T--) { scanf("%d%d",&n,&m); for (i=1;i<=n;i++) scanf("%d",a+i); make(1,n); while(m--) { scanf("%d%d%d",&flag,&x,&y);// x y 从0开始 x++; y++; //for (i=1;i<3*n;i++) printf("%d %d %d %d %d/n",t[i].a,t[i].b,t[i].mval,t[i].lval,t[i].rval); if (flag<2) mod(x,y,flag); else if (flag==2) rev(x,y); else if (flag==3) printf("%d/n",que_sum(x,y)); else printf("%d/n",que_val(x,y)); } } }