#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<queue>
using namespace std;
const int N =1010;
int dx[]={0,1,0,-1,1,1,-1,-1};
int dy[]={1,0,-1,0,1,-1,1,-1};
int h[N][N];
int n;
bool st[N][N];
struct node{
int x,y;
};
queue<node>q;
void bfs(int sx,int sy,bool&has_higher,bool&has_lower){
q.push({sx,sy});
st[sx][sy]=true;
while(!q.empty()){
node t=q.front();
q.pop();
for(int i=0;i<8;i++){
int a=t.x+dx[i];
int b=t.y+dy[i];
if(a<0 || a>=n || b<0 || b>=n)continue;
if(h[a][b]!=h[t.x][t.y]){
if(h[a][b]>h[t.x][t.y]) has_higher=true;
else has_lower=true;
}
else if(!st[a][b]){
q.push({a,b});
st[a][b]=true;
}
}
}
}
int main(){
cin>>n;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
cin>>h[i][j];
}
}
int peak=0,valley=0;//山峰和山谷
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(!st[i][j]){
bool has_higher=false,has_lower=false;
bfs(i,j,has_higher,has_lower);
if(!has_lower)valley++;
if(!has_higher)peak++;
}
}
}
cout<<peak<<' '<<valley<<endl;
return 0;
}