#include using namespace std; struct SegmentTree { struct node { int RedSum, BlackSum; int Lazy; node():RedSum(0), BlackSum(0), Lazy(0){}; }; vector< node > seg; int sz; SegmentTree(int n) { sz = 1; while(sz < n) sz <<= 1; seg.assign(sz * 2 - 1, node()); } inline void Update(int k, int l, int r) { int &R = seg[k].RedSum, &B = seg[k].BlackSum; R = 0, B = 0; if(seg[2 * k + 1].Lazy == 0) R += seg[2 * k + 1].RedSum, B += seg[2 * k + 1].BlackSum; else if(seg[2 * k + 1].Lazy == 1) R += (l + r) / 2 - l; else B += (l + r) / 2 - l; if(seg[2 * k + 2].Lazy == 0) R += seg[2 * k + 2].RedSum, B += seg[2 * k + 2].BlackSum; else if(seg[2 * k + 2].Lazy == 1) R += r - (l + r) / 2; else B += r - (l + r) / 2; } inline void Evaluation(int k, int l, int r) { if(seg[k].Lazy == 0) return; if(k < sz - 1) { seg[2 * k + 1].Lazy = seg[k].Lazy; seg[2 * k + 2].Lazy = seg[k].Lazy; Update(k, l, r); } else { if(seg[k].Lazy == 1) seg[k].RedSum = 1, seg[k].BlackSum = 0; else seg[k].RedSum = 0, seg[k].BlackSum = 1; } seg[k].Lazy = 0; } inline void Write(int a, int b, int x, int k, int l, int r) { Evaluation(k, l, r); if(a >= r || b <= l) return; if(a <= l && r <= b) { seg[k].Lazy = x; Evaluation(k, l, r); } else { Write(a, b, x, 2 * k + 1, l, l + r >> 1); Write(a, b, x, 2 * k + 2, l + r >> 1, r); Update(k, l, r); } } inline void RedWrite(int a, int b) { Write(a, b, 1, 0, 0, sz); } inline void BlackWrite(int a, int b) { Write(a, b, 2, 0, 0, sz); } inline pair< int, int > CountSum(int a, int b, int k, int l, int r) { Evaluation(k, l, r); if(a >= r || b <= l) return(make_pair(0, 0)); if(a <= l && r <= b) return(make_pair(seg[k].RedSum, seg[k].BlackSum)); pair< int, int > L = CountSum(a, b, 2 * k + 1, l, l + r >> 1); pair< int, int > R = CountSum(a, b, 2 * k + 2, l + r >> 1, r); return(make_pair(L.first + R.first, L.second + R.second)); } inline pair< int, int > CountSum(int a, int b) { return(CountSum(a, b, 0, 0, sz)); } }; int main() { int N, Q; scanf("%d", &N); SegmentTree seg(N); scanf("%d", &Q); long long R = 0, B = 0; while(Q--) { int x, l, r; scanf("%d %d %d", &x, &l, &r); if(x == 0) { pair< int, int > Sum = seg.CountSum(l, r + 1); if(Sum.first > Sum.second) R += Sum.first; else if(Sum.first < Sum.second) B += Sum.second; } else if(x == 1) { seg.RedWrite(l, r + 1); } else { seg.BlackWrite(l, r + 1); } } pair< int, int > Sum = seg.CountSum(0, N); printf("%lld %lld\n", R + Sum.first, B + Sum.second); }