#include <stdio.h>
using namespace std;
const int N=501;
const int dx[]={-1,-1,0,0,1,1};
const int dy[]={0,1,-1,1,-1,0};
int n;
char stare[N][N];
//0 - neocupat
//1 - rosu
//2 - albastru
struct punct
{
short int x;
short int y;
};
punct t[N][N];
//0,0 - radacina suprema
//0,1 - sus, 0,2 - jos, 1,0 - stanga, 2,0 - dreapta
punct rad (short int x, short int y)
{
punct r;
if(t[x][y].x==0 && t[x][y].y==0)
{
r.x=x;
r.y=y;
return r;
}
r=rad(t[x][y].x,t[x][y].y);
t[x][y]=r;
return r;
}
bool petabla (int x, int y)
{
if(x<1 || x>n) return 0;
if(y<1 || y>n) return 0;
return 1;
}
int main()
{
FILE *in,*out;
in=fopen("hex.in","r");
out=fopen("hex.out","w");
int i,j,x,y,xv,yv,s;
punct r1,r2;
bool gata=0;
fscanf(in,"%d",&n);
for(i=0;i<=n;i++)
for(j=0;j<=n;j++)
t[i][j].x=t[i][j].y=0;
i=1;
while(i<=n*n && !gata)
{
fscanf(in,"%d%d",&x,&y);
if(i%2==1) s=1;
else s=2;
stare[x][y]=s;
r1=rad(x,y);
for(j=0;j<6;j++)
{
xv=x+dx[j];
yv=y+dy[j];
if(petabla(xv,yv) && stare[xv][yv]==s)
{
r2=rad(xv,yv);
if(r1.x!=r2.x || r1.y!=r2.y)
t[r2.x][r2.y]=r1;
}
}
//verifica vecinitatea cu nodul de sus, jos, stanga, dreapta
if(s==1)
{
if(y==1)
{
r2=rad(1,0);
if(r1.x!=r2.x || r1.y!=r2.y)
{
t[r1.x][r1.y].x=r2.x;
t[r1.x][r1.y].y=r2.y;
}
}
if(y==n)
{
r2=rad(2,0);
if(r1.x!=r2.x || r1.y!=r2.y)
{
t[r1.x][r1.y].x=r2.x;
t[r1.x][r1.y].y=r2.y;
}
}
if(rad(1,0).x == rad(2,0).x && rad(1,0).y == rad(2,0).y)
gata=1;
}
if(s==2)
{
if(x==1)
{
r2=rad(0,1);
if(r1.x!=r2.x || r1.y!=r2.y)
{
t[r1.x][r1.y].x=r2.x;
t[r1.x][r1.y].y=r2.y;
}
}
if(x==n)
{
r2=rad(0,2);
if(r1.x!=r2.x || r1.y!=r2.y)
{
t[r1.x][r1.y].x=r2.x;
t[r1.x][r1.y].y=r2.y;
}
}
if(rad(0,1).x == rad(0,2).x && rad(0,1).y == rad(0,2).y)
gata=1;
}
i++;
}
fprintf(out,"%d",i-1);
return 0;
}