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 51 long long maxRectangleArea(vector<int>& xCoord, vector<int>& yCoord) {52 long ans = -1;53 const vector<pair<int, int>> points = getSortedPoints(xCoord, yCoord);54 const vector<int> ys = getUniqueAndSortedYs(yCoord);55 SegmentTree tree(ys.size(), -1);56 unordered_map<int, int> yToIndex;57 unordered_map<int, int> yToX;58 59 for (int i = 0; i < ys.size(); ++i)60 yToIndex[ys[i]] = i;61 62 auto [prevX, prevY] = points[0];63 for (int i = 1; i < points.size(); ++i) {64 const auto [x, y] = points[i];65 if (yToX.contains(prevY) && yToX.contains(y)) {66 const int xLeft = yToX[y];67 if (prevX == x && yToX[prevY] == xLeft &&68 xLeft > tree.query(yToIndex[prevY] + 1, yToIndex[y] - 1))69 ans = max(ans, static_cast<long>(y - prevY) * (x - xLeft));70 }71 yToX[prevY] = prevX;72 tree.update(yToIndex[prevY], prevX);73 prevX = x;74 prevY = y;75 }76 77 return ans;78 }79 80 private:81 vector<pair<int, int>> getSortedPoints(const vector<int>& xCoord,82 const vector<int>& yCoord) {83 vector<pair<int, int>> points;84 for (int i = 0; i < xCoord.size(); ++i)85 points.emplace_back(xCoord[i], yCoord[i]);86 ranges::sort(points);87 return points;88 }89 90 vector<int> getUniqueAndSortedYs(const vector<int>& yCoord) {91 vector<int> ys = yCoord;92 ranges::sort(ys);93 ys.erase(unique(ys.begin(), ys.end()), ys.end());94 return ys;95 }96};97