Use this to learn the idea, then write your own version.
1class SegmentTree {2 public:3 explicit SegmentTree(int n, int kInf) : kInf(kInf), n(n), tree(4 * n, kInf) {}4 5 6 void update(int i, int val) {7 update(0, 0, n - 1, i, val);8 }9 10 11 int query(int i, int j) const {12 return query(0, 0, n - 1, i, j);13 }14 15 private:16 const int kInf; 17 const int n; 18 vector<int> tree; 19 20 void update(int treeIndex, int lo, int hi, int i, int val) {21 if (lo == hi) {22 tree[treeIndex] = val;23 return;24 }25 const int mid = (lo + hi) / 2;26 if (i <= mid)27 update(2 * treeIndex + 1, lo, mid, i, val);28 else29 update(2 * treeIndex + 2, mid + 1, hi, i, val);30 tree[treeIndex] = merge(tree[2 * treeIndex + 1], tree[2 * treeIndex + 2]);31 }32 33 int query(int treeIndex, int lo, int hi, int i, int j) const {34 if (i <= lo && hi <= j) 35 return tree[treeIndex];36 if (j < lo || hi < i) 37 return kInf;38 const int mid = (lo + hi) / 2;39 return merge(query(treeIndex * 2 + 1, lo, mid, i, j),40 query(treeIndex * 2 + 2, mid + 1, hi, i, j));41 }42 43 int merge(int left, int right) const {44 return max(left, right);45 }46};47 48class Solution {49 public:50 int maxRectangleArea(vector<vector<int>>& points) {51 int ans = -1;52 ranges::sort(points);53 const vector<int> ys = getUniqueAndSortedYs(points);54 SegmentTree tree(ys.size(), -1);55 unordered_map<int, int> yToIndex;56 unordered_map<int, int> yToX;57 58 for (int i = 0; i < ys.size(); ++i)59 yToIndex[ys[i]] = i;60 61 int prevX = points[0][0];62 int prevY = points[0][1];63 64 for (int i = 1; i < points.size(); ++i) {65 const int x = points[i][0];66 const int y = points[i][1];67 if (yToX.contains(prevY) && yToX.contains(y)) {68 const int xLeft = yToX[y];69 if (prevX == x && yToX[prevY] == xLeft &&70 xLeft > tree.query(yToIndex[prevY] + 1, yToIndex[y] - 1))71 ans = max(ans, (y - prevY) * (x - xLeft));72 }73 yToX[prevY] = prevX;74 tree.update(yToIndex[prevY], prevX);75 prevX = x;76 prevY = y;77 }78 79 return ans;80 }81 82 private:83 vector<int> getUniqueAndSortedYs(const vector<vector<int>>& points) {84 vector<int> ys;85 for (const vector<int>& point : points)86 ys.push_back(point[1]);87 ranges::sort(ys);88 ys.erase(unique(ys.begin(), ys.end()), ys.end());89 return ys;90 }91};92