#include <bits/stdc++.h> using namespace std; const int N = 5e5; #define x first #define y second #define pii pair<int,int> int n, m, q, idlim; int idh(int x, int y) { return x * (m + 2) + y; } pii hdi(int id) { return pii(id / (m + 2), id % (m + 2)); } int idv(int x, int y) { return y * (n + 2) + x; } pii vdi(int id) { return pii(id % (n + 2), id / (n + 2)); } template<class T> struct array2d { T a[N]; int n, m; void init(int val = 0) { memset(a, val, sizeof(a)); } void set_size(int n, int m, int val = 0) { this->n = n; this->m = m; init(val); } T *operator[](int i) { return a + i * (m + 2); } const T *operator[](int i)const { return a + i * (m + 2); } T &operator[](pii p) { return a[p.x * (m + 2) + p.y]; } const T &operator[](pii p)const { return a[p.x * (m + 2) + p.y]; } }; array2d<int> v, h, col, lv, tim; vector<pii> piece; struct node { int ch[2], sz; }; node t[N * 30]; int cnt; void pushup(int x) { t[x].sz = t[t[x].ch[0]].sz + t[t[x].ch[1]].sz; } void insert(int p, int &x, int l, int r) { if (!x) x = ++cnt; if (l == r) { t[x].sz = 1; return; } int mid = (l + r) >> 1; if (p <= mid) insert(p, t[x].ch[0], l, mid); else insert(p, t[x].ch[1], mid + 1, r); pushup(x); } void erase(int p, int &x, int l, int r) { if (!x) return; if (l == r) { t[x].sz = 0; return; } int mid = (l + r) >> 1; if (p <= mid) erase(p, t[x].ch[0], l, mid); else erase(p, t[x].ch[1], mid + 1, r); pushup(x); } int merge(int x, int y) { if (!(x && y)) return x + y; t[x].ch[0] = merge(t[x].ch[0], t[y].ch[0]); t[x].ch[1] = merge(t[x].ch[1], t[y].ch[1]); if (t[x].ch[0] || t[x].ch[1]) pushup(x); else t[x].sz |= t[y].sz; return x; } int query_rk(int v, int x, int l, int r) { if (!t[x].sz) return 0; if (l == r) return t[x].sz; int mid = (l + r) >> 1; if (v <= mid) return query_rk(v, t[x].ch[0], l, mid); else return t[t[x].ch[0]].sz + query_rk(v, t[x].ch[1], mid + 1, r); }
c++一本通2085:棋局
最新推荐文章于 2023-06-25 15:11:28 发布