Use this to learn the idea, then write your own version.
1class SegmentTree {2 public:3 explicit SegmentTree(const vector<int>& nums) : n(nums.size()), tree(n * 4) {4 build(nums, 0, 0, n - 1);5 }6 7 8 void update(int i, int val) {9 update(0, 0, n - 1, i, val);10 }11 12 13 int queryFirst(int target) {14 return queryFirst(0, 0, n - 1, target);15 }16 17 private:18 const int n; 19 vector<int> tree; 20 21 void build(const vector<int>& nums, int treeIndex, int lo, int hi) {22 if (lo == hi) {23 tree[treeIndex] = nums[lo];24 return;25 }26 const int mid = (lo + hi) / 2;27 build(nums, 2 * treeIndex + 1, lo, mid);28 build(nums, 2 * treeIndex + 2, mid + 1, hi);29 tree[treeIndex] = merge(tree[2 * treeIndex + 1], tree[2 * treeIndex + 2]);30 }31 32 void update(int treeIndex, int lo, int hi, int i, int val) {33 if (lo == hi) {34 tree[treeIndex] = val;35 return;36 }37 const int mid = (lo + hi) / 2;38 if (i <= mid)39 update(2 * treeIndex + 1, lo, mid, i, val);40 else41 update(2 * treeIndex + 2, mid + 1, hi, i, val);42 tree[treeIndex] = merge(tree[2 * treeIndex + 1], tree[2 * treeIndex + 2]);43 }44 45 int queryFirst(int treeIndex, int lo, int hi, int target) {46 if (tree[treeIndex] < target)47 return -1;48 if (lo == hi) {49 50 update(lo, -1);51 return lo;52 }53 const int mid = (lo + hi) / 2;54 const int leftChild = tree[2 * treeIndex + 1];55 return leftChild >= target56 ? queryFirst(2 * treeIndex + 1, lo, mid, target)57 : queryFirst(2 * treeIndex + 2, mid + 1, hi, target);58 }59 60 int merge(int left, int right) const {61 return max(left, right);62 }63};64 65class Solution {66 public:67 int numOfUnplacedFruits(vector<int>& fruits, vector<int>& baskets) {68 int ans = 0;69 SegmentTree tree(baskets);70 71 for (const int fruit : fruits)72 if (tree.queryFirst(fruit) == -1)73 ++ans;74 75 return ans;76 }77};78