| #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; }
 |