id="code_img_closed_58b3634b-6698-487c-badd-8aa7a3d97709" class="code_img_closed"
class="code_img_opened" Onclick="cnblogs_code_hide(‘58b3634b-6698-487c-badd-8aa7a3d97709‘,event)"
class SegmentTree {
private:
int *mem;
int *idx;
int capacity;
int storage_size;
private:
void init_level_update() {
int k = capacity - 1;
while (--k >= 0) {
int L = (k<<1) + 1;
int R = L + 1;
if (mem[L] < mem[R]) {
mem[k] = mem[L];
idx[k] = idx[L];
} else {
mem[k] = mem[R];
idx[k] = idx[R];
}
}
}
pair<int, int> query(int a, int b, int idx, int L, int R) {
if (b <= L || a >= R) return make_pair(INT_MAX, -1);
if (a <= L && R <= b) return make_pair(mem[idx], this->idx[idx]);
pair<int, int> ml = query(a, b, (idx<<1) + 1, L, (L+R)/2);
pair<int, int> mr = query(a, b, (idx<<1) + 2, (L+R)/2, R);
return ml.first ml : mr;
}
void init_mem(int _capacity) {
if (_capacity <= 0) {
capacity = 0;
return;
}
int n = 1;
while (n <_capacity) n<<=1;
capacity = n;
storage_size = capacity * 2 - 1;
mem = new int[storage_size];
idx = new int[storage_size];
int k = 0;
while (k INT_MAX;
k = capacity - 1;
int i = 0;
while (k ;
}
public:
SegmentTree(int _capacity) {
init_mem(_capacity);
}
SegmentTree(vector<int>::iterator begin, vector<int>::iterator end) {
capacity = end - begin;
init_mem(capacity);
int k = capacity - 1;
vector<int>::iterator iter = begin;
while (iter != end) mem[k++] = *iter++;
init_level_update();
}
~SegmentTree() {
delete[] mem;
delete[] idx;
}
// update value in original data index
void update(int index, int val) {
if (index >= capacity || idx <0) return;
int k = index + capacity - 1; // internal storage index
mem[k] = val;
while (k > 0) {
k = (k - 1) >> 1;
int L = (k <<1) + 1;
int R = L + 1;
if (mem[L] < mem[R]) {
mem[k] = mem[L];
idx[k] = idx[L];
} else {
mem[k] = mem[R];
idx[k] = idx[R];
}
}
}
// retrive the min value in index range [a, b)
pair<int, int> query(int a, int b) {
return query(a, b, 0, 0, capacity);
}
void print_mem(const char* msg) {
cout<endl;
for (int i=0; i<(capacity*2-1); i++) {
cout<" ";
}
for (int i=0; i2 - 1; i++) {
cout<",";
}
cout<<endl;
}
};