# 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"; } } ```