summaryrefslogtreecommitdiff
path: root/datastructures/RMQ.cpp
diff options
context:
space:
mode:
authormzuenni <michi.zuendorf@gmail.com>2022-06-27 17:19:28 +0200
committermzuenni <michi.zuendorf@gmail.com>2022-06-27 17:19:28 +0200
commit5ab8a5088b729a9953b8dff1b2a985dc8fb2098b (patch)
treeed40d6936c0e9eee40ba62751cbf99ecddbaddc2 /datastructures/RMQ.cpp
parentadabbad9c51cf7cd3874bfde8eac1fbcf84fec10 (diff)
updated tcr
Diffstat (limited to 'datastructures/RMQ.cpp')
-rw-r--r--datastructures/RMQ.cpp27
1 files changed, 27 insertions, 0 deletions
diff --git a/datastructures/RMQ.cpp b/datastructures/RMQ.cpp
new file mode 100644
index 0000000..b38b838
--- /dev/null
+++ b/datastructures/RMQ.cpp
@@ -0,0 +1,27 @@
+vector<int> values;
+vector<vector<int>> rmq;
+
+int select(int a, int b) {
+ return values[a] <= values[b] ? a : b;
+}
+
+void build() {
+ for(int i = 0, s = 1, ss = 1; s <= values.size(); ss=s, s*=2, i++) {
+ for(int l = 0; l + s <= values.size(); l++) {
+ if(i == 0) rmq[0][l] = l;
+ else {
+ int r = l + ss;
+ rmq[i][l] = select(rmq[i-1][l], rmq[i-1][r]]);
+}}}}
+
+void init(vector<int>& v) {
+ values = v;
+ rmq = vector<vector<int>>(floor(log2(values.size()))+1, vector<int>(values.size()));
+ build();
+}
+
+int query(int l, int r) {
+ if(l >= r) return l;
+ int s = floor(log2(r-l)); r = r - (1 << s);
+ return select(rmq[s][l],rmq[s][r]);
+} \ No newline at end of file