#include<bits/stdc++.h>
#define INF 1000
using namespace std;
struct node{
int x,y;
int high;
};
struct irr_sec{
int l,r;
};
const int shift[4][2]={{-1,0},{1,0},{0,-1},{0,1}};
int n,m;
int dro;
int ans,last_pos;
int city[510][510];
bool vis[510][510],last[510];
irr_sec sour[510];
void bfs(int num){
queue<node> s;
node now;
now.x=1;now.y=num;now.high=city[now.x][now.y];
sour[num].l=INF;sour[num].r=0;
s.push(now);
vis[now.x][now.y]=true;
while(s.size()){
node p=s.front();
s.pop();
for(int i=0;i<4;i++){
if((p.x+shift[i][0]>0)&&(p.x+shift[i][0]<=n)&&(p.y+shift[i][1]>0)&&(p.y+shift[i][1]<=m)){
if(!vis[p.x+shift[i][0]][p.y+shift[i][1]]&&city[p.x+shift[i][0]][p.y+shift[i][1]]<p.high){
vis[p.x+shift[i][0]][p.y+shift[i][1]]=true;
node q;
q.x=p.x+shift[i][0];q.y=p.y+shift[i][1];q.high=city[q.x][q.y];
s.push(q);
if(q.x==n){
last[q.y]=true;
sour[num].l=min(sour[num].l,q.y);
sour[num].r=max(sour[num].r,q.y);
}
}
}
}
}
}
bool cmp(irr_sec a,irr_sec b){
if(a.l!=b.l) return a.l<b.l;
else return a.r<b.r;
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
scanf("%d",&city[i][j]);
}
}
for(int i=1;i<=m;i++){
memset(vis,0,sizeof(vis));
bfs(i);
}
for(int i=1;i<=m;i++){
if(!last[i]){
dro++;
}
}
if(dro){
if(n==1) printf("1\n%d\n",dro);
else printf("0\n%d\n",dro);
}else{
sort(sour+1,sour+m+1,cmp);
for(int i=1;i<=m;i++){
cout<<sour[i].l<<" "<<sour[i].r<<endl;
}
for(int i=1;i<=m;i++){
if(last_pos>=sour[i].l&&last_pos<=sour[i].r) continue;
ans++;
last_pos=sour[i].r;
}
printf("1\n%d\n",ans);
}
}
到底那里错了,蒟蒻求救