#include using namespace std; class SegTree { public: SegTree(int height){ mN = 1 << height; mpNode = new Node[mN*2-1]; memset( mpNode, 0, sizeof(Node) * (mN*2-1) ); mpNode[0].count[0] = mN; } ~SegTree() { delete[] mpNode; } void fill( int l, int r, int v ){ fill( l, r, v, 0, 0, mN ); } int count( int l, int r, int v ){ return count( l, r, v, 0, 0, mN ); } private: struct Node { int value; int count[3]; }; Node * mpNode; int mN; void fill( int l, int r, int v, int ni, int nl, int w ) { Node * p = mpNode + ni; if( v == p->value ) { return; } if( l == nl && r == nl+w-1 ) { p->value = v; p->count[0] = v==0 ? w : 0; p->count[1] = v==1 ? w : 0; p->count[2] = v==2 ? w : 0; return; } Node * c0 = mpNode + (ni*2+1); Node * c1 = c0 + 1; if( p->value >= 0 ) { c0->value = p->value; c0->count[0] = c0->value == 0 ? w/2 : 0; c0->count[1] = c0->value == 1 ? w/2 : 0; c0->count[2] = c0->value == 2 ? w/2 : 0; c1->value = p->value; c1->count[0] = c1->value == 0 ? w/2 : 0; c1->count[1] = c1->value == 1 ? w/2 : 0; c1->count[2] = c1->value == 2 ? w/2 : 0; p->value = -1; } if( l < nl+w/2 ) { fill( l, min(nl+w/2-1,r), v, ni*2+1, nl, w/2 ); } if( r >= nl+w/2 ) { fill( max(l,nl+w/2), r, v, ni*2+2, nl+w/2, w/2 ); } p->count[0] = c0->count[0] + c1->count[0]; p->count[1] = c0->count[1] + c1->count[1]; p->count[2] = c0->count[2] + c1->count[2]; } int count( int l, int r, int v, int ni, int nl, int w ) { Node * p = mpNode + ni; if( p->value >= 0 ) { return p->value == v ? r-l+1 : 0; } else if( l==nl && r==nl+w-1 ) { return p->count[v]; } else { int result = 0; if( l < nl+w/2 ) { result += count( l, min(nl+w/2-1,r), v, ni*2+1, nl, w/2 ); } if( r >= nl+w/2 ) { result += count( max(l,nl+w/2), r, v, ni*2+2, nl+w/2, w/2 ); } return result; } } }; int N,Q; int main() { cin >> N >> Q; long long a=0,b=0; SegTree st(18); for(int i=0; i> x >> l >> r; if(x==0){ int ta = st.count(l,r,1); int tb = st.count(l,r,2); if(ta>tb) a+=ta; if(ta