<p>You are given an integer <code>n</code>. You have an <code>n x n</code> binary grid <code>grid</code> with all values initially <code>1</code>&#39;s except for some indices given in the array <code>mines</code>. The <code>i<sup>th</sup></code> element of the array <code>mines</code> is defined as <code>mines[i] = [x<sub>i</sub>, y<sub>i</sub>]</code> where <code>grid[x<sub>i</sub>][y<sub>i</sub>] == 0</code>.</p>

<p>Return <em>the order of the largest <strong>axis-aligned</strong> plus sign of </em>1<em>&#39;s contained in </em><code>grid</code>. If there is none, return <code>0</code>.</p>

<p>An <strong>axis-aligned plus sign</strong> of <code>1</code>&#39;s of order <code>k</code> has some center <code>grid[r][c] == 1</code> along with four arms of length <code>k - 1</code> going up, down, left, and right, and made of <code>1</code>&#39;s. Note that there could be <code>0</code>&#39;s or <code>1</code>&#39;s beyond the arms of the plus sign, only the relevant area of the plus sign is checked for <code>1</code>&#39;s.</p>

<p>&nbsp;</p>
<p><strong class="example">Example 1:</strong></p>
<img alt="" src="https://assets.leetcode.com/uploads/2021/06/13/plus1-grid.jpg" style="width: 404px; height: 405px;" />
<pre>
<strong>Input:</strong> n = 5, mines = [[4,2]]
<strong>Output:</strong> 2
<strong>Explanation:</strong> In the above grid, the largest plus sign can only be of order 2. One of them is shown.
</pre>

<p><strong class="example">Example 2:</strong></p>
<img alt="" src="https://assets.leetcode.com/uploads/2021/06/13/plus2-grid.jpg" style="width: 84px; height: 85px;" />
<pre>
<strong>Input:</strong> n = 1, mines = [[0,0]]
<strong>Output:</strong> 0
<strong>Explanation:</strong> There is no plus sign, so return 0.
</pre>

<p>&nbsp;</p>
<p><strong>Constraints:</strong></p>

<ul>
	<li><code>1 &lt;= n &lt;= 500</code></li>
	<li><code>1 &lt;= mines.length &lt;= 5000</code></li>
	<li><code>0 &lt;= x<sub>i</sub>, y<sub>i</sub> &lt; n</code></li>
	<li>All the pairs <code>(x<sub>i</sub>, y<sub>i</sub>)</code> are <strong>unique</strong>.</li>
</ul>

class Solution {
public:
    int orderOfLargestPlusSign(int n, vector<vector<int>>& mines) {
        int m=mines.size();
        vector<vector<int>> grid(n,vector<int> (n,1));
        vector<int> sum_x(n,0),sum_y(n,0);
        for(int i=0;i<m;i++){
            grid[mines[i][0]][mines[i][1]]=0;
        }

        vector<vector<int>> dp(n,vector<int> (n,0));
        for(int i=0;i<n;i++){
            for(int j=0;j<n;j++){
                if(j==0){
                    sum_x[j]=grid[i][j];
                }
                else{
                    sum_x[j]=sum_x[j-1]+grid[i][j];
                }
            }

            for(int j=0;j<n;j++){
                if (grid[i][j] == 1){
                    int len = INT_MAX;
                    int l = 0, r = j - 1, l1 = 0;
                    while (l <= r)
                    {
                        int mid = (l + r) / 2;
                        if (sum_x[j] - sum_x[mid] == j - mid && grid[i][mid])
                        {
                            l1 = max(l1, j - mid);
                            r = mid - 1;
                        }
                        else
                        {
                            l=mid+1;
                        }
                    }

                    len = min(len, l1);

                    l = j + 1, r = n - 1, l1 = 0;
                    while (l <= r)
                    {
                        int mid = (l + r) / 2;
                        if (sum_x[mid] - sum_x[j] == mid - j && grid[i][mid])
                        {
                            l1 = max(l1, mid - j);
                            l = mid + 1;
                        }
                        else
                        {
                            r=mid-1;
                        }
                    }

                    len = min(len, l1);

                    dp[i][j]=len+1;
                }
            }
        }

        for(int j=0;j<n;j++){
            for(int i=0;i<n;i++){
                if(i==0){
                    sum_y[i]=grid[i][j];
                }
                else{
                    sum_y[i]=sum_y[i-1]+grid[i][j];
                }
            }

            for(int i=0;i<n;i++){
                if(grid[i][j]){
                    int len = INT_MAX;
                    int l = 0, r = i - 1, l1 = 0;
                    while (l <= r)
                    {
                        int mid = (l + r) / 2;
                        if (sum_y[i] - sum_y[mid] == i - mid && grid[mid][j])
                        {
                            l1 = max(l1, i - mid);
                            r = mid - 1;
                        }
                        else
                        {
                            l=mid+1;
                        }
                    }

                    len = min(len, l1);

                    l = i + 1, r = n - 1, l1 = 0;
                    while (l <= r)
                    {
                        int mid = (l + r) / 2;
                        if (sum_y[mid] - sum_y[i] == mid - i && grid[mid][j])
                        {
                            l1 = max(l1, mid - i);
                            l = mid + 1;
                        }
                        else
                        {
                            r=mid-1;
                        }
                    }

                    len = min(len, l1);

                    dp[i][j]=min(dp[i][j],len+1);
                }
            }
        }

        int ans=0;
        for(int i=0;i<n;i++){
            for(int j=0;j<n;j++){
                ans=max(ans,dp[i][j]);
            }
        }

        return ans;
    }
};
45323