#include<bits/stdc++.h>
using namespace std;
struct mxmn {
int mx;
int mn;
};
int n,m;
int num=0;
int ans=0;
int mp[505][505];
mxmn dp[505][505];
bool mk[505][505];
vector<mxmn> line;
bool cmp(mxmn a,mxmn b) {
return a.mn<b.mn;
}
mxmn dfs(mxmn ret,int x,int y) {
if(mk[x][y]==1) return dp[x][y];
if(x+1<=m && mp[x+1][y]<mp[x][y]) {
mxmn rt=dfs(ret,x+1,y);
ret.mn=min(ret.mn,rt.mn);
ret.mx=max(ret.mx,rt.mx);
}
if(x-1>=1 && mp[x-1][y]<mp[x][y]) {
mxmn rt=dfs(ret,x-1,y);
ret.mn=min(ret.mn,rt.mn);
ret.mx=max(ret.mx,rt.mx);
}
if(y+1<=n && mp[x][y+1]<mp[x][y]) {
mxmn rt=dfs(ret,x,y+1);
ret.mn=min(ret.mn,rt.mn);
ret.mx=max(ret.mx,rt.mx);
}
if(y-1>=1 && mp[x][y-1]<mp[x][y]) {
mxmn rt=dfs(ret,x,y-1);
ret.mn=min(ret.mn,rt.mn);
ret.mx=max(ret.mx,rt.mx);
}
if(y==n) {
num++;
ret.mn=min(ret.mn,x);
ret.mx=max(ret.mx,x);
}
mk[x][y]=1;
dp[x][y]=ret;
return ret;
}
int main() {
scanf("%d%d",&n,&m);
for(int i=1; i<=n; i++) for(int j=1; j<=m; j++) scanf("%d",&mp[j][i]);
mxmn init;
init.mn=1919810;
init.mx=0;
for(int i=1; i<=m; i++) if((i==1 && mp[i][1]>=mp[i+1][1]) || (i==m && mp[i][1]>=mp[i-1][1]) || (mp[i][1]>=mp[i+1][1] && mp[i][1]>=mp[i-1][1])) {
// cout<<i<<" "<<mp[i][1]<<endl;
line.push_back(dfs(init,i,1));
}
// for(int i=0; i<line.size(); i++) cout<<line[i].mn<<" ";
// cout<<endl;
// for(int i=0; i<line.size(); i++) cout<<line[i].mx<<" ";
// cout<<num;
if(num!=m) {
cout<<0<<endl;
cout<<m-num;
return 0;
}
sort(line.begin(),line.end(),cmp);
// for(int i=0; i<line.size(); i++) cout<<line[i].mn<<" ";
// cout<<endl;
// for(int i=0; i<line.size(); i++) cout<<line[i].mx<<" ";
// cout<<endl;
int mn=1;
int mx=0;
int ind=0;
while(mn<=m) {
// for (int i = 1; i <= m; i++) {
if(line[ind].mn>mn) {
ans++;
mn=mx;
}
mx=max(line[ind++].mx, mx);
// ans++;
// }
// for (int i = 0; i < m; i++) {
// if(line[i].mn<=mn) {
// mx=max(line[i].mx, mx);
// }
//
// ans++;
// mn=mx + 1;
//// ans++;
// }
}
cout<<1<<endl;
cout<<ans;
return 0;
}
不知道是不是区间覆盖写错了 求解答QAQ