��ǰλ�� ������ҳ > ApocalypseTq�IJ��ͣ�P7825 ��RdOI R3��VSQ ���
������?O(n\sqrt{n}\log n)O(nn?logn)?���㷨��ͨ����˴�����ݷ�Χ,���ǿ����Ƿ����?O(n\log^2n)O(nlog2n)?���㷨��
���������뵽����һ������Ϊ?n-1n?1?��?0101?��?bb?Ϊ?b_i=a_i\ xor\ a_{i+1}bi?=ai??xor?ai+1?������,����Ϊ?k-1k?1?��ȫΪ?11?��?bb?���Ӵ��ʹ�����һ������Ϊ?kk?�� VS ����
���ǿ������ȥά��?bb?����,�ȿ���β�ѯ��
�輫��������?l,rl,r?Ϊ?\forall i\in [l,r] b_i=1 \land b_{l-1}=b_{r+1}=0?i��[l,r]bi?=1��bl?1?=br+1?=0,��?b_0=b_{n+1}=0b0?=bn+1?=0��
�������ǿ�һ���߶���,�߶�����ÿ����ά�����Ǹ����������м���������,������������� ODT �ķ�ʽ�� set ά�����䡣
����?33?����,������Ҫ�ҵ����������м���������,����һ������Ϊ?l(l\ge k-1)l(l��k?1)?�ļ���������,�����ڴ𰸵Ĺ�����?l-k+2l?k+2���������?ll?��?-k+2?k+2?�����ֿ���,���ǾͿ���ÿ���ڵ���һ����״����ά������?\ge k-1��k?1?�ļ������������Ⱥͺ�������ô𰸡�
ע�ǰ����ĵ�һ���������������ܺ���һ����������һ������������ƴ�ӵõ��𰸡� ����?44?����,������Ҫ��������ڼ������������ȵ����ֵ��������Ҫһ����ɾ��,ά�����ȵ����ֵ��ͬ��ע�ǰ����ĵ�һ���������������ܺ���һ����������һ������������ƴ�ӵõ��𰸡�
���������ǿ��ġ�
����?0/10/1?����,���Ƿ������Ὣ?[l,r-1][l,r?1]?�ڵ�?bb?ȫ����ֵΪ?00,���ǿ����ҵ���ЩΪ?11?��?bb,Ȼ������һ��һ��ɾ����Ȼ��ע��?l-1l?1?��?ll,rr?��?r+1r+1?�Ƿ��ʹ?bb?�����䶯��
����?22?����,���Ƿ���������?[l,r-1][l,r?1]?�ڵ�?bb?��Ӱ��,����ֻ��Ҫע��?l-1l?1?��?ll,rr?��?r+1r+1?�Ƿ��ʹ?bb?�����䶯��
Ϊ��ά���߽�,������Ҫ����һ���߶���ά��?aa?����ʵֵ��
���Ƿ���?bb?������Ϊ?11?��������?O(n)O(n)?��,ÿ�β����������?O(1)O(1)?��,����?0/10/1?����ɾ�����������ܺ�Ϊ?O(n)O(n)?��,���Ը��Ӷ���ȷ:O(n\log^2n)O(nlog2n)��
ʵ����,�������������,���ĺܶ��ʱ���ܵñȱ���������
#include<bits/stdc++.h>
#define lc id<<1
#define rc id<<1|1
using namespace std;
//ȥ���˿����д
const int maxn=3e5+5;
typedef const int ci;
struct node {
int l,r;
node() {}
node(ci l,ci r) {
this->l=l,this->r=r;
}
const bool operator<(const node &b)const {
return l<b.l;
}
const bool operator==(const node &b)const {
return l==b.l&&r==b.r;
}
} lst;//ά������ṹ��
struct que {
priority_queue<int> q,e;
void ins(ci x) {
q.push(x);
}
void del(ci x) {
q.top()==x?q.pop():e.push(x);
}
int top() {
while(q.size()&&e.size()&&q.top()==e.top())q.pop(),e.pop();
return q.size()?q.top():0;
}
};//�Զ���
typedef set<node>::iterator iter;
int a[maxn],b[maxn],n,m;
namespace Seg {
struct tree {
int l,r,mid;
char v,tag,rev;
} t[maxn*4];
void build(ci id,ci l,ci r) {
t[id]=(tree) {
l,r,l+r>>1,0,-1,0
};
if(l==r)return t[id].v=a[l],void();
ci mid=l+r>>1;
build(lc,l,mid),build(rc,mid+1,r);
}
void chtag(ci id,char v) {
t[id].v=t[id].tag=v,t[id].rev=0;
}
void revtag(ci id) {
t[id].rev^=1,t[id].v^=1;
if(~t[id].tag)t[id].tag^=1;
}
void pushdown(ci id) {
if(t[id].rev)revtag(lc),revtag(rc),t[id].rev=0;
char &k=t[id].tag;
if(~k)chtag(lc,k),chtag(rc,k),k=-1;
}
void change(ci id,ci l,ci r,ci v) {
if(t[id].l>=l&&t[id].r<=r)return chtag(id,v);
pushdown(id);
if(l<=t[id].mid)change(lc,l,r,v);
if(r>t[id].mid)change(rc,l,r,v);
}
void rev(ci id,ci l,ci r) {
if(t[id].l>=l&&t[id].r<=r)return revtag(id);
pushdown(id);
if(l<=t[id].mid)rev(lc,l,r);
if(r>t[id].mid)rev(rc,l,r);
}
int ask(ci id,ci v) {
if(t[id].l==t[id].r)return t[id].v;
pushdown(id);
return ask(v<=t[id].mid?lc:rc,v);
}
}//ά����ʵֵ�߶���
struct tree {
int l,r,mid,len;
set<node> s;
vector<int> c,w;
que q;
void add(int x,ci v) {
v>0?q.ins(x):q.del(x);
if(x==1)return;
ci y=x;
x=len-x+1;
while(x<=len)c[x]+=v,w[x]+=v*y,x+=x&(-x);
}
int ask(int x) {
if(x==1)return 0;
ci y=x;
int sum=0;
x=len-x+1;
while(x)sum+=w[x]-c[x]*(y-1),x-=x&(-x);
return sum;
}//ά�� 3 ������״����
void change0(ci x) {
iter it=s.upper_bound(node(x,0));
it--;
ci l=it->l,r=it->r,len=r-l+1;
if(l==x&&r==x)return add(1,-1),s.erase(it),void();
add(len,-1),s.erase(it);
if(l==x)return add(len-1,1),s.insert(node(l+1,r)),void();
if(r==x)return add(len-1,1),s.insert(node(l,r-1)),void();
add(x-l,1),s.insert(node(l,x-1));
add(r-x,1),s.insert(node(x+1,r));
}//�� 1 ��� 0
void change1(ci x) {
if(!s.size())return add(1,1),s.insert(node(x,x)),void();
iter ir=s.upper_bound(node(x,0)),il=ir;
il--;
const bool pd1=ir!=s.begin()&&il->r==x-1,pd2=ir!=s.end()&&ir->l==x+1;
if(!pd1&&!pd2)return add(1,1),s.insert(node(x,x)),void();
if(!pd2) {
ci l=il->l;
add(x-l,-1),s.erase(il);
add(x-l+1,1),s.insert(node(l,x));
return;
}
if(!pd1) {
ci r=ir->r;
add(r-x,-1),s.erase(ir);
add(r-x+1,1),s.insert(node(x,r));
return;
}
ci l=il->l,r=ir->r;
add(x-l,-1),s.erase(il);
add(r-x,-1),s.erase(ir);
add(r-l+1,1),s.insert(node(l,r));
}//�� 0 ��� 1
iter split(int p) {
iter it=s.lower_bound(node(p,-1)),tmp=it;
tmp--;
if(it!=s.end()&&(it==s.begin()||it->l==p))return it;
if(tmp->r>=p) {
int l=tmp->l,r=tmp->r;
add(r-l+1,-1),s.erase(tmp);
if(p>l)add(p-l,1),s.insert(node(l,p-1));
return add(r-p+1,1),s.insert(node(p,r)).first;
}
return it;
}//���� ODT split ��һ������
} t[maxn*4];
void build(ci id,ci l,ci r) {
t[id]=(tree) {
l,r,l+r>>1,r-l+1
};
t[id].c.resize(r-l+2),t[id].w.resize(r-l+2);
for(register int i=l; i<=r; i++)if(b[i])t[id].change1(i);
if(l==r)return;
ci mid=l+r>>1;
build(lc,l,mid),build(rc,mid+1,r);
}
void add(ci id,ci v,const bool p) {
p?t[id].change1(v):t[id].change0(v);
if(t[id].l==t[id].r)return;
v<=t[id].mid?add(lc,v,p):add(rc,v,p);
}
void del(ci id,ci l,ci r) {
if(!t[id].s.size())return;
if(t[id].l>=l&&t[id].r<=r) {
for(register iter it=t[id].s.begin(); it!=t[id].s.end(); it=t[id].s.erase(it))
t[id].add(it->r-it->l+1,-1);
if(t[id].l!=t[id].r)del(lc,l,r),del(rc,l,r);
return;
}
for(iter ir=t[id].split(min(t[id].r,r)+1),il=t[id].split(max(t[id].l,l)); il!=ir; il=t[id].s.erase(il))
t[id].add(il->r-il->l+1,-1);
if(l<=t[id].mid)del(lc,l,r);
if(r>t[id].mid)del(rc,l,r);
}//ɾ�� [l,r-1] ������ 1
int asksum(ci id,ci l,ci r,ci k) {
if(t[id].l>=l&&t[id].r<=r) {
if(!t[id].s.size())return 0;
int sum=t[id].len>=k?t[id].ask(k):0;
node now=*t[id].s.begin(),nl=*--t[id].s.end();
if(lst.r+1!=now.l)return lst=nl,sum;
sum+=max(now.r-lst.l+1-k+1,0)-max(now.r-now.l+1-k+1,0)-max(lst.r-lst.l+1-k+1,0);
lst=nl==now?node(lst.l,nl.r):nl;
return sum;
}
int sum=0;
if(l<=t[id].mid)sum+=asksum(lc,l,r,k);
if(r>t[id].mid)sum+=asksum(rc,l,r,k);
return sum;
}//3 ����
int askmax(ci id,ci l,ci r) {
if(t[id].l>=l&&t[id].r<=r) {
if(!t[id].s.size())return 1;
int sum=t[id].q.top();
node now=*t[id].s.begin(),nl=*--t[id].s.end();
if(lst.r+1!=now.l)return lst=nl,sum+1;
sum=max(sum,now.r-lst.l+1),lst=nl==now?node(lst.l,nl.r):nl;
return sum+1;
}
int sum=1;
if(l<=t[id].mid)sum=max(sum,askmax(lc,l,r));
if(r>t[id].mid)sum=max(sum,askmax(rc,l,r));
return sum;
}//4 ����
int main() {
int op,l,r,z;
n=read(),m=read();
for(register int i=1; i<=n; i++)a[i]=read();
Seg::build(1,1,n);
for(register int i=1; i<n; i++) {
b[i]=a[i]^a[i+1];
}
build(1,1,n-1);
while(m--) {
op=read(),l=read(),r=read();
if(op<=1) {
if(l<r)del(1,l,r-1);
if(l>1) {
ci x=Seg::ask(1,l-1),y=Seg::ask(1,l);
if(x!=op&&y!=op)add(1,l-1,1);
if(x==op&&y!=op)add(1,l-1,0);
}
if(r<n) {
ci x=Seg::ask(1,r+1),y=Seg::ask(1,r);
if(x!=op&&y!=op)add(1,r,1);
if(x==op&&y!=op)add(1,r,0);
}
Seg::change(1,l,r,op);
}
if(op==2) {
if(l>1)Seg::ask(1,l-1)!=Seg::ask(1,l)?add(1,l-1,0):add(1,l-1,1);
if(r<n)Seg::ask(1,r)!=Seg::ask(1,r+1)?add(1,r,0):add(1,r,1);
Seg::rev(1,l,r);
}
if(op==3)z=read(),lst=node(-1,-1),printnum(asksum(1,l,r-1,z-1),'\n');
if(op==4)lst=node(-1,-1),printnum(askmax(1,l,r-1),'\n');
}
pc(0,1);
return 0;
}
д�ں���:�������������Ļ��Ǻܲ�����,����ʵ�ֵ�������������������г�����Ϊ�����?O(n\log^2n)O(nlog2n)?����,�������,лл��
cs