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
| #include <bits/stdc++.h>
using namespace std; typedef long long LL;
const int MAXN = 2E5 + 5;
int n, q, type, x; LL ans;
struct Node { int lson, rson; int l, r, mi, lazy; } tr[MAXN * 8];
int root1, root2;
void update(int id) { tr[id].mi = min(tr[tr[id].lson].mi, tr[tr[id].rson].mi); }
void pushdown(int id) { if (tr[id].lazy != n) { tr[tr[id].lson].mi = min(tr[tr[id].lson].mi, tr[id].lazy); tr[tr[id].lson].lazy = min(tr[tr[id].lson].lazy, tr[id].lazy); tr[tr[id].rson].mi = min(tr[tr[id].rson].mi, tr[id].lazy); tr[tr[id].rson].lazy = min(tr[tr[id].rson].lazy, tr[id].lazy); tr[id].lazy = n; } }
void build(int& id, int l, int r) { static int tot; id = ++tot; tr[id].l = l, tr[id].r = r; tr[id].lazy = n; if (l == r) { tr[id].mi = n; return; } int mid = l + r >> 1; build(tr[id].lson, l, mid); build(tr[id].rson, mid + 1, r); update(id); }
void modify(int id, int l, int r, int val) { if (tr[id].mi < val) return; if (tr[id].l == l && tr[id].r == r) { tr[id].mi = min(tr[id].mi, val); tr[id].lazy = min(tr[id].lazy, val); return; } pushdown(id); int mid = tr[id].l + tr[id].r >> 1; if (r <= mid) modify(tr[id].lson, l, r, val); else if (l > mid) modify(tr[id].rson, l, r, val); else { modify(tr[id].lson, l, mid, val); modify(tr[id].rson, mid + 1, r, val); } update(id); }
int query(int id, int x) { if (tr[id].l == x && tr[id].r == x) { return tr[id].mi; } pushdown(id); int mid = tr[id].l + tr[id].r >> 1; if (x <= mid) return query(tr[id].lson, x); else return query(tr[id].rson, x); }
int main() { ios::sync_with_stdio(false); cin.tie(0), cout.tie(0); cin >> n >> q; ans = 1ll * (n - 2) * (n - 2); build(root1, 2, n - 1); build(root2, 2, n - 1); for (int i = 1; i <= q; i++) { cin >> type >> x; if (type == 1) { int now = query(root1, x); ans-= now - 2; modify(root2, 2, now - 1, x); } else { int now = query(root2, x); ans -= now - 2; modify(root1, 2, now - 1, x); } } cout << ans; return 0; }
|