1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126
| #pragma GCC optimize(2) #include <bits/stdc++.h>
const int kMaxN = 5e5 + 5;
struct Node { int l; mutable int r, v;
Node(int _l, int _r, int _v) : l(_l), r(_r), v(_v) {}
friend bool operator <(const Node &n1, const Node &n2) { return n1.l < n2.l; } };
int n, q; int c[kMaxN], op[kMaxN], l[kMaxN], r[kMaxN]; std::set<Node> s;
namespace BIT { void upd(int x, int v) { for (; x <= n; x += x & -x) c[x] += v; } void upd(int l, int r, int v) { upd(l, v), upd(r + 1, -v); }
int qry(int x) { int ret = 5e5; for (; x; x -= x & -x) ret += c[x]; return ret; } }
auto split(int x) { if (x > n) return s.end(); auto it = std::prev(s.upper_bound({x, 0, 0})); if (it->l == x) return it; int r = it->r; it->r = x - 1; return s.emplace(x, r, it->v).first; }
void inc(int l, int r) { BIT::upd(l, r, 1); auto itl = split(l), itr = split(r + 1); for (auto it = itl; it != itr; ++it) if (~it->v) ++it->v; }
void dec(int l, int r) { BIT::upd(l, r, -1); auto itl = split(l), itr = split(r + 1); for (auto it = itl; it != itr; ++it) if (~it->v) --it->v; }
void addtag(int l, int r) { auto itl = split(l), itr = split(r + 1); for (auto it = itl; it != itr; ++it) if (!~it->v) it->v = 0; }
void goback(int l, int r) { auto itl = split(l), itr = split(r + 1); for (auto it = itl; it != itr; ++it) if (~it->v) BIT::upd(it->l, it->r, -it->v); s.erase(itl, itr), s.emplace(l, r, -1); }
bool check() { for (int i = 1; i <= q; ++i) if (op[i] == 3 || op[i] == 4) return 0; for (int i = 1; i <= q; ++i) { if (op[i] == 1) { BIT::upd(l[i], r[i], 1); } else if (op[i] == 2) { BIT::upd(l[i], r[i], -1); } else { std::cout << BIT::qry(l[i]) << '\n'; } } return 1; }
void dickdreamer() { std::cin >> n >> q; for (int i = 1; i <= q; ++i) std::cin >> op[i] >> l[i] >> r[i]; if (check()) return; s.emplace(1, n, -1); for (int i = 1; i <= q; ++i) { if (op[i] == 1) { inc(l[i], r[i]); } else if (op[i] == 2) { dec(l[i], r[i]); } else if (op[i] == 3) { addtag(l[i], r[i]); } else if (op[i] == 4) { goback(l[i], r[i]); } else { std::cout << BIT::qry(l[i]) << '\n'; } } }
int32_t main() { #ifdef ORZXKR freopen("in.txt", "r", stdin); freopen("out.txt", "w", stdout); #endif std::ios::sync_with_stdio(0), std::cin.tie(0), std::cout.tie(0); int T = 1; while (T--) dickdreamer(); return 0; }
|