#include <stdio.h> #include <string.h> #include <iostream> #include <algorithm> #include <map> typedef long long LL; typedef unsigned long long ULL; static const int mod = 100000007; static const int maxN = 3e5 + 10; typedef std::pair<int, int>PII; bool lazy[maxN << 2]; int sum[maxN << 2]; std::map<int, int>hsMap; int ql[maxN], qr[maxN], qt[maxN]; int fp[maxN]; inline int compute(int l, int r) { return fp[r] - fp[l] + 1; } inline void build(int l, int r, int v) { lazy[v] = false; sum[v] = compute(l, r); if (l >= r) { return; } int mid = l + r >> 1; build(l, mid, v << 1); build(mid + 1, r, v << 1 | 1); } inline void pushUp(int l, int r, int v) { lazy[v] = lazy[v << 1] && lazy[v << 1 | 1]; if (lazy[v << 1] && lazy[v << 1 | 1]) { sum[v] = 0; return; } int mid = l + r >> 1; sum[v] = compute(l, r) - (compute(l, mid) - sum[v << 1]) - (compute(mid + 1, r) - sum[v << 1 | 1]); } inline void update(int l, int r, int x, int y, int v) { if (l >= x && r <= y) { lazy[v] = true; sum[v] = 0; return; } if (lazy[v]) return; int mid = l + r >> 1; if (x <= mid) update(l, mid, x, y, v << 1); if (mid < y) update(mid + 1, r, x, y, v << 1 | 1); pushUp(l, r, v); } inline int query(int l, int r, int x, int y, int v) { if (l >= x && r <= y) { return sum[v]; } if (lazy[v]) return 0; int mid = l + r >> 1; int result = 0; if (x <= mid) result = query(l, mid, x, y, v << 1); if (mid < y) result += query(mid + 1, r, x, y, v << 1 | 1); return result; } int main() { int n, q; hsMap.clear(); scanf("%d%d", &n, &q); for (int i = 0; i < q; ++i) { scanf("%d%d%d", qt + i, ql + i, qr + i); if (ql[i] - 1) hsMap[ql[i] - 1] = 1; hsMap[ql[i]] = 1; hsMap[ql[i] + 1] = 1; if (qr[i] - 1) hsMap[qr[i] - 1] = 1; hsMap[qr[i]] = 1; hsMap[qr[i] + 1] = 1; } int pos = 0; for (std::map<int, int>::iterator iter = hsMap.begin(); iter != hsMap.end(); ++iter) { iter->second = ++pos; fp[pos] = iter->first; } build(1, pos, 1); for (int i = 0; i < q; ++i) { if (1 == qt[i]) update(1, pos, hsMap[ql[i]], hsMap[qr[i]], 1); if (2 == qt[i]) printf("%d\n", query(1, pos, hsMap[ql[i]], hsMap[qr[i]], 1)); } return 0; }
|