#include class SegmentTree { private: vector segVal; void maintain(int node) { segVal[node] = max(segVal[node * 2], segVal[node * 2 + 1]); } void build(const vector& 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& 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; } };