3
vector<int> nextSmallerElement(int *arr, int n) {8
for (int i = n - 1; i >= 0; i--) {11
while (st.top() != -1 && arr[st.top()] >= curr) {21
vector<int> prevSmallerElement(int *arr, int n) {26
for (int i = 0; i < n; i++) {29
while (st.top() != -1 && arr[st.top()] >= curr) {39
int largestRectangleArea(int *heights, int n) {43
next = nextSmallerElement(heights, n);46
prev = prevSmallerElement(heights, n);48
for (int i = 0; i < n; i++) {49
int length = heights[i];51
if (next[i] == -1) next[i] = n;53
int breadth = next[i] - prev[i] - 1;54
int newArea = length * breadth;55
area = max(area, newArea);61
int maximalRectangle(vector<vector<char>> &matrix) {62
int n = matrix.size();63
int m = matrix[0].size();66
for (int i = 0; i < n; i++) {67
for (int j = 0; j < m; j++) {68
M[i][j] = matrix[i][j] - '0';72
// step 1 : compute area of 1st row73
int area = largestRectangleArea(M[0], m);75
for (int i = 1; i < n; i++) {76
for (int j = 0; j < m; j++) {77
// step 2 : add upar wala element if it is 179
M[i][j] = M[i][j] + M[i - 1][j];85
area = max(area, largestRectangleArea(M[i], m));