41 lines
995 B
C++
41 lines
995 B
C++
#include <vector>
|
|
|
|
class SegmentTree {
|
|
private:
|
|
vector<int> segVal;
|
|
void maintain(int node) {
|
|
segVal[node] = max(segVal[node * 2], segVal[node * 2 + 1]);
|
|
}
|
|
void build(const vector<int>& vec, int node, int left, int right) {
|
|
if (left == right) {
|
|
segVal[node] = vec[left];
|
|
return;
|
|
}
|
|
int mid = (left + right) / 2;
|
|
build(vec, node * 2, left, mid);
|
|
build(vec, node * 2 + 1, mid + 1, right);
|
|
maintain(node);
|
|
}
|
|
public:
|
|
SegmentTree(const vector<int>& vec) {
|
|
size_t n = vec.size();
|
|
segVal.resize(2 << std::bit_width(n - 1));
|
|
build(vec, 1, 0, n - 1);
|
|
}
|
|
int findFirstAndUpdate(int node, int left, int right, int val) {
|
|
if (segVal[node] < val) {
|
|
return -1; // not found;
|
|
}
|
|
if (left == right) {
|
|
segVal[node] = -1; // update state
|
|
return left;
|
|
}
|
|
int mid = (left + right) / 2;
|
|
int idx = findFirstAndUpdate(node * 2, left, mid, val);
|
|
if (idx < 0) {
|
|
idx = findFirstAndUpdate(node * 2 + 1, mid + 1, right, val);
|
|
}
|
|
maintain(node);
|
|
return idx;
|
|
}
|
|
}; |