Changes
8 changed files (+16/-16)
-
-
@@ -3,7 +3,7 @@ int val;y_node* c[2]; y_node() { val = 0; c[0] = c[1] = 0; } y_node* get_c(int i) { return (!c[i] ? c[i] = new y_node : c[i]); } void update(int y, int v, int l = -1, int r = MN) { void update(int y, int v, int l = -1, int r = MX) { if (l == r) val += v; else { int m = (l + r) >> 1;
-
@@ -11,7 +11,7 @@ y <= m ? get_c(0)->update(y, v, l, m) : get_c(1)->update(y, v, m + 1, r);val = (c[0] ? c[0]->val : 0) + (c[1] ? c[1]->val : 0); } } int query(int yl, int yr, int l = -1, int r = MN) { int query(int yl, int yr, int l = -1, int r = MX) { if (yl > r || yr < l) return 0; if (yl <= l && yr >= r) return val; int m = (l + r) >> 1;
-
@@ -24,7 +24,7 @@ y_node seg;x_node* c[2]; x_node() { c[0] = c[1] = 0;} x_node* get_c(int i) { return (!c[i] ? c[i] = new x_node : c[i]); } void update(int x, int y, int v, int l = -1, int r = MN) { void update(int x, int y, int v, int l = -1, int r = MX) { if (l == r) seg.update(y, v); else { int m = (l + r) >> 1;
-
@@ -32,7 +32,7 @@ x <= m ? get_c(0)->update(x, y, v, l, m) : get_c(1)->update(x, y, v, m + 1, r);seg.update(y, (c[0] ? c[0]->seg.query(y, y) : 0) + (c[1] ? c[1]->seg.query(y, y) : 0)); } } int query(int xl, int xr, int yl, int yr, int l = -1, int r = MN) { int query(int xl, int xr, int yl, int yr, int l = -1, int r = MX) { if (xl > r || xr < l) return 0; if (xl <= l && xr >= r) return seg.query(yl, yr); int m = (l + r) >> 1;
-
-
-
@@ -22,7 +22,7 @@ if (a <= l && b >= r) return val;int m = (l + r) >> 1; return (c[0] ? c[0]->query(a, b, l, m) : 0) + (c[1] ? c[1]->query(a, b, m + 1, r) : 0); } } FT[MN]; } FT[MX]; void update(int x, int y, int v) { for (; x < N; x += x & -x) FT[x].update(y, v); } int query(int x, int y1, int y2) { int ret = 0; for (; x > 0; x -= x & -x) ret += FT[x].query(y1, y2); return ret; }
-
-
-
@@ -3,11 +3,11 @@ #include <ext/pb_ds/tree_policy.hpp>using namespace std; using namespace __gnu_pbds; template<typename T> using ordered_set = tree<T, null_type, less_equal<T>, rb_tree_tag, tree_order_statistics_node_update>; constexpr int MN = MN; constexpr int MX = MX; ordered_set<int> S[4 * MN]; ordered_set<int> S[4 * MX]; void update(int x, int y, int l = 0, int r = MN, int n = 1) { void update(int x, int y, int l = 0, int r = MX, int n = 1) { if (l != r) { int m = (l + r) >> 1; x <= m ? update(x, y, l, m, n << 1) : update(x, y, m + 1, r, n << 1 | 1);
-
@@ -15,7 +15,7 @@ }S[n].insert(y); } int query(int xl, int xr, int yl, int yr, int l = 0, int r = MN, int n = 1) { int query(int xl, int xr, int yl, int yr, int l = 0, int r = MX, int n = 1) { if (l > r || l > xr || r < xl) return 0; if (l >= xl && r <= xr) return S[n].order_of_key(yr + 1) - S[n].order_of_key(yl); else {
-
-
-
@@ -1,5 +1,5 @@template<typename T> struct seg_tree { T seg[4*MN], tmp[4*MN]; T seg[4*MX], tmp[4*MX]; inline T pull(const T & a, const T & b) { return a+b; } inline void push(int l, int r, int n) { seg[n] += (r-l+1)*tmp[n];
-
-
-
@@ -1,6 +1,6 @@namespace centroid { int sz[MN], cpar[MN]; bitset<MN> vis; int sz[MX], cpar[MX]; bitset<MX> vis; void dfs(vector<int> * G, int u, int p = 0) { sz[u] = 1; for (int v : G[u]) if (v != p && !vis[v]) dfs(G, v, u), sz[u] += sz[v];
-
-
-
@@ -1,5 +1,5 @@namespace lca { int d[MN], L[MN][20]; int d[MX], L[MX][20]; void dfs(vector<int> * G, int u = 1, int p = 0) { d[u] = d[p] + 1, L[u][0] = p; for (int i = 0; i < 18 && L[u][i]; i++) L[u][i + 1] = L[L[u][i]][i];
-
-
-
@@ -1,7 +1,7 @@namespace tarjan { int cnt, scc_num, scc[MN], in[MN], low[MN]; int cnt, scc_num, scc[MX], in[MX], low[MX]; stack<int> s; bitset<MN> ins; bitset<MX> ins; void tarjan(vector<int> * G, int u) { low[u] = in[u] = cnt++, ins[u] = 1; s.push(u); for (int v : G[u]) {
-
-
-
@@ -11,7 +11,7 @@ }inline ll inv(ll x) { return pw(x, MOD-2); } ll fact[MN] = { 1 }, ifact[MN] = { 1 }; ll fact[MX] = { 1 }, ifact[MX] = { 1 }; inline ll nCr(int n, int k) { return fact[n]*ifact[k]%MOD*ifact[n-k]%MOD; }
-