---
# System prepended metadata

title: Bảng số

---

# Table - Bảng số
Cách tiếp thu tốt nhất là tự đọc code :>
## Subtask 1
Nhận thấy bảng chỉ có 1 cột và số truy vấn không lớn nên mới truy vấn ta sẽ duyệt tất cả các $(u,v)$ 
```cpp=
namespace Subtask1{
    int a[101];
    void solve(){
        for(int j=1;j<=n;j++) cin>>a[j];
        int k;cin>>k;
        while(k--)
            {
                int u,v,mi=3,ma=0,res=0;cin>>u>>v;
                for(int i=u;i<=v;i++)
                    {
                        mi=3;ma=0;
                        for(int j=i;j<=v;j++)
                        {
                            _min(mi,a[j]),_max(ma,a[j]);
                            if (ma-mi>1) break;
                            _max(res,j-i+1);
                        }
                    }
                cout<<res<<"\n";
            }
    }
}
```
## Subtask 2 
```cpp=
int main()
{
    ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    if (fopen(name".inp","r"))
        {
            freopen(name".inp","r",stdin);
            freopen(name".out","w+",stdout);
        }
    cin>>n>>m;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++) cin>>a[i][j];
    for(int i=1;i<=n;i++)
        {
            for(int j=i;j<=n;j++)
            {
                stack<int> s;
                dp[i][j]=dp[i][j-1];
                for(int k=1;k<=m;k++) 
                    {
                        h[k]=(a[j][k]<=1)?h[k]+1:0;
                        while (s.size() and h[s.top()]>=h[k]) s.pop();
                        l[k]=(s.size()?s.top()+1:1);
                        s.push(k);
                    }
                while (s.size()) s.pop();
                for(int k=m;k>0;k--)
                    {
                        while (s.size() and h[s.top()]>=h[k]) s.pop();
                        r[k]=(s.size()?s.top()-1:m);
                        s.push(k);
                        _max(dp[i][j],h[k]*(r[k]-l[k]+1));
                    } 

            }  
            memset(h,0,sizeof(h));
        }
    for(int i=1;i<=n;i++)
        {
            for(int j=i;j<=n;j++)
            {
                stack<int> s;
                _max(dp[i][j],dp[i][j-1]);
                for(int k=1;k<=m;k++) 
                    {
                        h[k]=(a[j][k]>=1)?h[k]+1:0;
                        while (s.size() and h[s.top()]>=h[k]) s.pop();
                        l[k]=(s.size()?s.top()+1:1);
                        s.push(k);
                    }
                while (s.size()) s.pop();
                for(int k=m;k>0;k--)
                    {
                        while (s.size() and h[s.top()]>=h[k]) s.pop();
                        r[k]=(s.size()?s.top()-1:m);
                        s.push(k);
                        _max(dp[i][j],h[k]*(r[k]-l[k]+1));
                    } 
            }  
            memset(h,0,sizeof(h));
        }
    int q;cin>>q;
    while (q--)
    {
        int u,v;cin>>u>>v;
        cout<<dp[u][v]<<"\n";
    }
}
```