From f666edf536597a9e426a0648e76275ee4c4aaf0e Mon Sep 17 00:00:00 2001 From: subcrip Date: Sun, 8 Sep 2024 14:49:18 +0800 Subject: [PATCH] Add trees/sparse_table_2d.cc Signed-off-by: subcrip --- trees/sparse_table_2d.cc | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 trees/sparse_table_2d.cc diff --git a/trees/sparse_table_2d.cc b/trees/sparse_table_2d.cc new file mode 100644 index 0000000..0ee4ae6 --- /dev/null +++ b/trees/sparse_table_2d.cc @@ -0,0 +1,32 @@ +template> struct sparse_table_2d { + _Op op; + vector>>> st; + sparse_table_2d(const vector>& a, _Op&& __operation) { + op = __operation; + int n = a.size(); + int m = int(log2(n) + 1); + st = vector(n, vector(n, vector(m, vector<_Tp>(m)))); + for (int k = 0; k < m; ++k) { + for (int l = 0; l < m; ++l) { + for (int i = 0; i + (1 << k) <= n; ++i) { + for (int j = 0; j + (1 << l) <= n; ++j) { + if (k == 0) { + if (l == 0) { + st[i][j][k][l] = a[i][j]; + } else { + st[i][j][k][l] = op(st[i][j][k][l - 1], st[i][j + (1 << l - 1)][k][l - 1]); + } + } else { + st[i][j][k][l] = op(st[i][j][k - 1][l], st[i + (1 << k - 1)][j][k - 1][l]); + } + } + } + } + } + } + _Tp query(size_t x1, size_t y1, size_t x2, size_t y2) { + int s1 = lg2(x2 - x1 + 1); + int s2 = lg2(y2 - y1 + 1); + return op(st[x1][y1][s1][s2], op(st[x2 - (1 << s1) + 1][y1][s1][s2], op(st[x1][y2 - (1 << s2) + 1][s1][s2], st[x2 - (1 << s1) + 1][y2 - (1 << s2) + 1][s1][s2]))); + } +};