#include #include using namespace std; vector arb(400005, 0); vector lazy(400005, false); int n, m; void update(int node, int start, int end, int left, int right) { if (lazy[node]) { arb[node] = (end - start + 1) - arb[node]; if (start != end) { lazy[node * 2] = !lazy[node * 2]; lazy[node * 2 + 1] = !lazy[node * 2 + 1]; } lazy[node] = false; } if (start > end || left > end || start > right) return; if (start >= left && end <= right) { arb[node] = (end - start + 1) - arb[node]; if (start != end) { lazy[node * 2] = !lazy[node * 2]; lazy[node * 2 + 1] = !lazy[node * 2 + 1]; } return; } int mid = (start + end) / 2; update(node * 2, start, mid, left, right); update(node * 2 + 1, mid + 1, end, left, right); arb[node] = arb[node * 2] + arb[node * 2 + 1]; } int valQuery(int node, int start, int end, int left, int right) { if (start > end || left > end || start > right) return 0 ; if (lazy[node]) { arb[node] = (end - start + 1) - arb[node]; if (start != end) { lazy[node * 2] = !lazy[node * 2]; lazy[node * 2 + 1] = !lazy[node * 2 + 1]; } lazy[node] = false; } if (start >= left && end <= right) return arb[node]; int mid = (start + end) / 2; int lefties = valQuery(node * 2, start, mid, left, right); int righties = valQuery(node * 2 + 1, mid + 1, end, left, right); return lefties + righties; } int getMin(int pos, int value) { int mid, low = 1, hi = pos; int qRes, target, p = -1; while (low <= hi) { mid = (low + hi) / 2; qRes = valQuery(1, 1, n, mid, hi); target = hi - mid + 1; if (value == 0) qRes = (hi - mid + 1) - qRes; if (qRes < target) low = mid + 1; else hi = mid - 1, p = mid; } return p; } int getMax(int pos, int value) { int mid, low = pos, hi = n; int qRes, target, p = -1; while (low <= hi) { mid = (low + hi) / 2; qRes = valQuery(1, 1, n, low, mid); target = mid - low + 1; if (value == 0) qRes = (mid - low + 1) - qRes; if (qRes < target) hi = mid - 1; else low = mid + 1, p = mid; } return p; } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); cin >> n >> m; int op, a, b; while(m--) { cin >> op; if (op == 1) { cin >> a >> b; update(1, 1, n, a, b); } else { cin >> a; b = valQuery(1, 1, n, a, a); cout << b << " " << getMin(a, b) << " " << getMax(a, b) << "\n"; } } return 0; }