#include #include #include using namespace std; #define inf 100000 int n,m; int a[101][10010]; int r[101][10010],c[101][10010]; int que[10010][2],p,q; inline int max(int x,int y){return x=que[q][1]) q--; que[++q][0]=j;que[q][1]=a[i][j]+j-1; while(p<=q && que[q][1]=1;j--) { while(p<=q && j-a[i][j]+1<=que[q][1]) q--; que[++q][0]=j;que[q][1]=j-a[i][j]+1; while(p<=q && que[q][1]>j) q--; if (p<=q) r[i][j]=min(r[i][j], que[q][0]-j+1); } } for (int j=1;j<=m;j++) { p=1;q=0; for (int i=1;i<=n;i++) { while(p<=q && a[i][j]+i-1>=que[q][1]) q--; que[++q][0]=i;que[q][1]=a[i][j]+i-1; while(p<=q && que[q][1]=1;i--) { while(p<=q && i-a[i][j]+1<=que[q][1]) q--; que[++q][0]=i;que[q][1]=i-a[i][j]+1; while(p<=q && que[q][1]>i) q--; if (p<=q) c[i][j]=min(c[i][j], que[q][0]-i+1); } } int tmp=0; for (int i=1;i<=n;i++) for (int j=1;j<=m;j++) { tmp=max(tmp,max(c[i][j],r[i][j])); } if (tmp==ans) break; ans=tmp; for (int i=1;i<=n;i++) for (int j=1;j<=m;j++) { a[i][j]=(a[i][j]