#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define popcount __builtin_popcount using namespace std; typedef long long int ll; typedef pair P; typedef pair Pl; template struct LazySegmentTree{ using F=function; using G=function; using H=function; int sz; vector data; vector lazy; const F f; const G g; const H h; const Monoid e1; const OperatorMonoid e0; LazySegmentTree(int n, const F f, const G g, const H h, const Monoid &e1, const OperatorMonoid &e0): f(f), g(g), h(h), e1(e1), e0(e0){ sz=1; while(sz v){ for(int i=0; i=0; i--) data[i]=f(data[2*i+1], data[2*i+2]); } void eval(int k, int l, int r){ if(lazy[k]!=e0){ data[k]=g(data[k], lazy[k], r-l); if(k>n>>q; auto f=[](P a, P b){ return P(a.first+b.first, a.second+b.second);}; auto g=[](P a, Pl p, int len){ int c=a.first; ll v=a.second; if(p.first.first==0){ ll x=p.second; if(x&1) return P(len-c, v+x*len); else return P(c, v+x*len); }else{ ll x=p.first.second, y=p.second; ll w=y*len; if(x&1) w+=len-c; else w+=c; if((x+y)&1) return P(len-c, w); else return P(c, w); } }; auto h=[](Pl p, Pl q){ if(q.first.first==1){ return Pl(P(1, (p.first.second+p.second+q.first.second)%2), q.second); }else{ return Pl(p.first, p.second+q.second); } }; LazySegmentTree seg(n, f, g, h, P(0, 0), Pl(P(0, 0), 0)); vector

a(n); for(int i=0; i>ai; a[i]=P(ai%2, ai); } seg.build(a); for(int i=0; i>t>>l>>r; if(t==1){ seg.update(l-1, r, Pl(P(1, 0), 0)); }else if(t==2){ int x; cin>>x; seg.update(l-1, r, Pl(P(0, 0), x)); }else{ cout<