From f4d19062f29640a4da50fc1e9b08b898dc4fea61 Mon Sep 17 00:00:00 2001 From: goo-gy Date: Fri, 14 Jan 2022 15:08:08 +0900 Subject: [PATCH] Index Tree #1 --- Algorithm/indexTree.cpp | 64 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 Algorithm/indexTree.cpp diff --git a/Algorithm/indexTree.cpp b/Algorithm/indexTree.cpp new file mode 100644 index 0000000..64bbcec --- /dev/null +++ b/Algorithm/indexTree.cpp @@ -0,0 +1,64 @@ +#include + +using namespace std; + +class IndexTree +{ +public: + int leafLeft; + int treeSize; + vector v_tree; + IndexTree(int N) + { + for (leafLeft = 1; leafLeft < N; leafLeft *= 2) + ; + treeSize = leafLeft * 2; + v_tree.resize(treeSize); + } + + long long logicFun(long long num1, long long num2) + { + // TODO : set logic + return num1 + num2; + } + + void updateTree(int index) + { + if (index == 0) + return; + v_tree[index] = logicFun(v_tree[2 * index], v_tree[2 * index + 1]); + updateTree(index / 2); + } + + void update(int order, long long data) + { + int index = leafLeft + order - 1; + v_tree[index] = data; + updateTree(index / 2); + } + + long long query(int begin, int end) + { + int L = leafLeft + begin - 1; + int R = leafLeft + end - 1; + + // TODO: set initial + long long result = 0; + while (L < R) + { + int nextL = (L + 1) / 2; + int nextR = (R - 1) / 2; + + if (nextL != L / 2) + result = logicFun(result, v_tree[L]); + if (nextR != R / 2) + result = logicFun(result, v_tree[R]); + + L = nextL; + R = nextR; + } + if (L == R) + result = logicFun(result, v_tree[L]); + return result; + } +};