#pragma GCC optimize("Ofast")
#pragma GCC optimize("unroll-loops")
#pragma GCC optimize("inline")
#include<bits/stdc++.h>
using namespace std;
void * wmem;
char memarr[ 96000000 ] ;
template < class T> inline void walloc1d( T ** arr, int x, void ** mem = & wmem) {
static int skip[ 16 ] = { 0 , 15 , 14 , 13 , 12 , 11 , 10 , 9 , 8 , 7 , 6 , 5 , 4 , 3 , 2 , 1 } ;
( * mem) = ( void * ) ( ( ( char * ) ( * mem) ) + skip[ ( ( unsigned long long ) ( * mem) ) & 15 ] ) ;
( * arr) = ( T* ) ( * mem) ;
( * mem) = ( ( * arr) + x) ;
}
template < class T> inline void walloc1d( T ** arr, int x1, int x2, void ** mem = & wmem) {
walloc1d( arr, x2- x1, mem) ;
( * arr) - = x1;
}
template < class T> inline void walloc2d( T *** arr, int x, int y, void ** mem = & wmem) {
int i;
walloc1d( arr, x, mem) ;
for ( i= ( 0 ) ; i< ( x) ; i++ ) {
walloc1d( & ( ( * arr) [ i] ) , y, mem) ;
}
}
template < class T> inline void walloc2d( T *** arr, int x1, int x2, int y1, int y2, void ** mem = & wmem) {
int i;
walloc1d( arr, x1, x2, mem) ;
for ( i= ( x1) ; i< ( x2) ; i++ ) {
walloc1d( & ( ( * arr) [ i] ) , y1, y2, mem) ;
}
}
struct unionFind{
int * d;
int N;
int M;
inline void malloc ( const int n) {
d = ( int * ) std:: malloc ( n* sizeof ( int ) ) ;
M = n;
}
inline void malloc ( const int n, const int fg) {
d = ( int * ) std:: malloc ( n* sizeof ( int ) ) ;
M = n;
if ( fg) {
init( n) ;
}
}
inline void free ( void ) {
std:: free ( d) ;
}
inline void walloc( const int n, void ** mem= & wmem) {
walloc1d( & d, n, mem) ;
M = n;
}
inline void walloc( const int n, const int fg, void ** mem= & wmem) {
walloc1d( & d, n, mem) ;
M = n;
if ( fg) {
init( n) ;
}
}
inline void init( const int n) {
int i;
N = n;
for ( i= ( 0 ) ; i< ( n) ; i++ ) {
d[ i] = - 1 ;
}
}
inline void init( void ) {
init( M) ;
}
inline int get( int a) {
int t = a;
int k;
while ( d[ t] >= 0 ) {
t= d[ t] ;
}
while ( d[ a] >= 0 ) {
k= d[ a] ;
d[ a] = t;
a= k;
}
return a;
}
inline int connect( int a, int b) {
if ( d[ a] >= 0 ) {
a= get( a) ;
}
if ( d[ b] >= 0 ) {
b= get( b) ;
}
if ( a== b) {
return 0 ;
}
if ( d[ a] < d[ b] ) {
d[ a] + = d[ b] ;
d[ b] = a;
}
else {
d[ b] + = d[ a] ;
d[ a] = b;
}
return 1 ;
}
inline int operator( ) ( int a) {
return get( a) ;
}
inline int operator( ) ( int a, int b) {
return connect( a,b) ;
}
inline int & operator[ ] ( const int a) {
return d[ a] ;
}
inline int size( int a) {
a = get( a) ;
return - d[ a] ;
}
inline int sizeList( int res[ ] ) {
int i;
int sz= 0 ;
for ( i= ( 0 ) ; i< ( N) ; i++ ) {
if ( d[ i] < 0 ) {
res[ sz++ ] = - d[ i] ;
}
}
return sz;
}
inline int comp( int res[ ] , void * mem = wmem) {
int i;
int sz= 0 ;
int * cnt;
walloc1d( & cnt, N, & mem) ;
for ( i= ( 0 ) ; i< ( N) ; i++ ) {
cnt[ i] = 0 ;
}
for ( i= ( 0 ) ; i< ( N) ; i++ ) {
cnt[ get( i) ] = 1 ;
}
for ( i= ( 0 ) ; i< ( N) ; i++ ) {
if ( cnt[ i] ) {
cnt[ i] = sz++ ;
}
}
for ( i= ( 0 ) ; i< ( N) ; i++ ) {
res[ i] = cnt[ get( i) ] ;
}
return sz;
}
}
;
struct dimcomp2{
int B;
dimcomp2( ) {
}
dimcomp2( int b) {
B = b;
}
dimcomp2( int a, int b) {
B = b;
}
inline void set( int b) {
B = b;
}
inline void set( int a, int b) {
B = b;
}
inline int mask( int a, int b) {
return a * B + b;
}
inline int operator( ) ( int a, int b) {
return a * B + b;
}
inline void para( int mask, int & a, int & b) {
a = mask / B;
b = mask % B;
}
inline void operator( ) ( int mask, int & a, int & b) {
a = mask / B;
b = mask % B;
}
}
;
#define main dummy_main
int main( ) {
wmem = memarr;
return 0 ;
}
#undef main
class Solution{
public :
int latestDayToCross( int X, int Y, vector< vector< int >> & cells) {
int k;
dummy_main( ) ;
int i;
int j;
int d = X * Y;
int ** s;
int node = d;
int st = node++ ;
int ed = node++ ;
unionFind uf;
dimcomp2 dm( X,Y) ;
uf.walloc ( node,1 ) ;
walloc2d( & s, X, Y) ;
for ( i= ( 0 ) ; i< ( X) ; i++ ) {
for ( j= ( 0 ) ; j< ( Y) ; j++ ) {
s[ i] [ j] = 0 ;
}
}
for ( k= ( d) - 1 ; k>= ( 0 ) ; k-- ) {
int ni, nj;
auto FmcKpFmN = ( ( cells[ k] [ 0 ] ) - 1 ) ;
auto xr20shxY = ( ( cells[ k] [ 1 ] ) - 1 ) ;
i= FmcKpFmN;
j= xr20shxY;
s[ i] [ j] = 1 ;
static int WYIGIcGE[ 4 ] = { - 1 , 0 , 0 , 1 } ;
static int t_ynMSdg[ 4 ] = { 0 , - 1 , 1 , 0 } ;
int KrdatlYV;
for ( KrdatlYV= ( 0 ) ; KrdatlYV< ( 4 ) ; KrdatlYV++ ) {
ni = ( i) + WYIGIcGE[ KrdatlYV] ;
nj = ( j) + t_ynMSdg[ KrdatlYV] ;
if ( 0 <= nj && nj < Y) {
if ( ni == - 1 ) {
uf( dm( i,j) , st) ;
continue ;
}
if ( ni == X) {
uf( dm( i,j) , ed) ;
continue ;
}
if ( s[ ni] [ nj] ) {
uf( dm( i,j) , dm( ni,nj) ) ;
}
}
}
if ( uf( st) == uf( ed) ) {
break ;
}
}
return k;
}
}
;
// cLay version 20210816-1
// --- original code ---
// #define main dummy_main
// {}
// #undef main
//
// class Solution {
// public:
// int latestDayToCross(int X, int Y, vector<vector<int>>& cells) {
// dummy_main();
// int i, j, d = X * Y, **s;
// int node = d, st = node++, ed = node++;
// unionFind uf;
// dimcomp2 dm(X,Y);
//
// uf.walloc(node,1);
// walloc2d(&s, X, Y);
// rep(i,X) rep(j,Y) s[i][j] = 0;
//
// rrep(k,d){
// (i, j) = (cells[k][0], cells[k][1]) - 1;
// s[i][j] = 1;
// rep_dist(ni,nj,i,j) if(0 <= nj < Y) {
// if(ni == -1) uf(dm(i,j), st), continue;
// if(ni == X) uf(dm(i,j), ed), continue;
// if(s[ni][nj]) uf(dm(i,j), dm(ni,nj));
// }
// if(uf(st) == uf(ed)) break;
// }
// return k;
// }
// };
I3ByYWdtYSBHQ0Mgb3B0aW1pemUoIk9mYXN0IikKI3ByYWdtYSBHQ0Mgb3B0aW1pemUoInVucm9sbC1sb29wcyIpCiNwcmFnbWEgR0NDIG9wdGltaXplKCJpbmxpbmUiKQojaW5jbHVkZTxiaXRzL3N0ZGMrKy5oPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwp2b2lkKndtZW07CmNoYXIgbWVtYXJyWzk2MDAwMDAwXTsKdGVtcGxhdGU8Y2xhc3MgVD4gaW5saW5lIHZvaWQgd2FsbG9jMWQoVCAqKmFyciwgaW50IHgsIHZvaWQgKiptZW0gPSAmd21lbSl7CiAgc3RhdGljIGludCBza2lwWzE2XSA9IHswLCAxNSwgMTQsIDEzLCAxMiwgMTEsIDEwLCA5LCA4LCA3LCA2LCA1LCA0LCAzLCAyLCAxfTsKICAoKm1lbSkgPSAodm9pZCopKCAoKGNoYXIqKSgqbWVtKSkgKyBza2lwWygodW5zaWduZWQgbG9uZyBsb25nKSgqbWVtKSkgJiAxNV0gKTsKICAoKmFycik9KFQqKSgqbWVtKTsKICAoKm1lbSk9KCgqYXJyKSt4KTsKfQp0ZW1wbGF0ZTxjbGFzcyBUPiBpbmxpbmUgdm9pZCB3YWxsb2MxZChUICoqYXJyLCBpbnQgeDEsIGludCB4Miwgdm9pZCAqKm1lbSA9ICZ3bWVtKXsKICB3YWxsb2MxZChhcnIsIHgyLXgxLCBtZW0pOwogICgqYXJyKSAtPSB4MTsKfQp0ZW1wbGF0ZTxjbGFzcyBUPiBpbmxpbmUgdm9pZCB3YWxsb2MyZChUICoqKmFyciwgaW50IHgsIGludCB5LCB2b2lkICoqbWVtID0gJndtZW0pewogIGludCBpOwogIHdhbGxvYzFkKGFyciwgeCwgbWVtKTsKICBmb3IoaT0oMCk7aTwoeCk7aSsrKXsKICAgIHdhbGxvYzFkKCYoKCphcnIpW2ldKSwgeSwgbWVtKTsKICB9Cn0KdGVtcGxhdGU8Y2xhc3MgVD4gaW5saW5lIHZvaWQgd2FsbG9jMmQoVCAqKiphcnIsIGludCB4MSwgaW50IHgyLCBpbnQgeTEsIGludCB5Miwgdm9pZCAqKm1lbSA9ICZ3bWVtKXsKICBpbnQgaTsKICB3YWxsb2MxZChhcnIsIHgxLCB4MiwgbWVtKTsKICBmb3IoaT0oeDEpO2k8KHgyKTtpKyspewogICAgd2FsbG9jMWQoJigoKmFycilbaV0pLCB5MSwgeTIsIG1lbSk7CiAgfQp9CnN0cnVjdCB1bmlvbkZpbmR7CiAgaW50KmQ7CiAgaW50IE47CiAgaW50IE07CiAgaW5saW5lIHZvaWQgbWFsbG9jKGNvbnN0IGludCBuKXsKICAgIGQgPSAoaW50KilzdGQ6Om1hbGxvYyhuKnNpemVvZihpbnQpKTsKICAgIE0gPSBuOwogIH0KICBpbmxpbmUgdm9pZCBtYWxsb2MoY29uc3QgaW50IG4sIGNvbnN0IGludCBmZyl7CiAgICBkID0gKGludCopc3RkOjptYWxsb2MobipzaXplb2YoaW50KSk7CiAgICBNID0gbjsKICAgIGlmKGZnKXsKICAgICAgaW5pdChuKTsKICAgIH0KICB9CiAgaW5saW5lIHZvaWQgZnJlZSh2b2lkKXsKICAgIHN0ZDo6ZnJlZShkKTsKICB9CiAgaW5saW5lIHZvaWQgd2FsbG9jKGNvbnN0IGludCBuLCB2b2lkICoqbWVtPSZ3bWVtKXsKICAgIHdhbGxvYzFkKCZkLCBuLCBtZW0pOwogICAgTSA9IG47CiAgfQogIGlubGluZSB2b2lkIHdhbGxvYyhjb25zdCBpbnQgbiwgY29uc3QgaW50IGZnLCB2b2lkICoqbWVtPSZ3bWVtKXsKICAgIHdhbGxvYzFkKCZkLCBuLCBtZW0pOwogICAgTSA9IG47CiAgICBpZihmZyl7CiAgICAgIGluaXQobik7CiAgICB9CiAgfQogIGlubGluZSB2b2lkIGluaXQoY29uc3QgaW50IG4pewogICAgaW50IGk7CiAgICBOID0gbjsKICAgIGZvcihpPSgwKTtpPChuKTtpKyspewogICAgICBkW2ldID0gLTE7CiAgICB9CiAgfQogIGlubGluZSB2b2lkIGluaXQodm9pZCl7CiAgICBpbml0KE0pOwogIH0KICBpbmxpbmUgaW50IGdldChpbnQgYSl7CiAgICBpbnQgdCA9IGE7CiAgICBpbnQgazsKICAgIHdoaWxlKGRbdF0+PTApewogICAgICB0PWRbdF07CiAgICB9CiAgICB3aGlsZShkW2FdPj0wKXsKICAgICAgaz1kW2FdOwogICAgICBkW2FdPXQ7CiAgICAgIGE9azsKICAgIH0KICAgIHJldHVybiBhOwogIH0KICBpbmxpbmUgaW50IGNvbm5lY3QoaW50IGEsIGludCBiKXsKICAgIGlmKGRbYV0+PTApewogICAgICBhPWdldChhKTsKICAgIH0KICAgIGlmKGRbYl0+PTApewogICAgICBiPWdldChiKTsKICAgIH0KICAgIGlmKGE9PWIpewogICAgICByZXR1cm4gMDsKICAgIH0KICAgIGlmKGRbYV0gPCBkW2JdKXsKICAgICAgZFthXSArPSBkW2JdOwogICAgICBkW2JdID0gYTsKICAgIH0KICAgIGVsc2V7CiAgICAgIGRbYl0gKz0gZFthXTsKICAgICAgZFthXSA9IGI7CiAgICB9CiAgICByZXR1cm4gMTsKICB9CiAgaW5saW5lIGludCBvcGVyYXRvcigpKGludCBhKXsKICAgIHJldHVybiBnZXQoYSk7CiAgfQogIGlubGluZSBpbnQgb3BlcmF0b3IoKShpbnQgYSwgaW50IGIpewogICAgcmV0dXJuIGNvbm5lY3QoYSxiKTsKICB9CiAgaW5saW5lIGludCYgb3BlcmF0b3JbXShjb25zdCBpbnQgYSl7CiAgICByZXR1cm4gZFthXTsKICB9CiAgaW5saW5lIGludCBzaXplKGludCBhKXsKICAgIGEgPSBnZXQoYSk7CiAgICByZXR1cm4gLWRbYV07CiAgfQogIGlubGluZSBpbnQgc2l6ZUxpc3QoaW50IHJlc1tdKXsKICAgIGludCBpOwogICAgaW50IHN6PTA7CiAgICBmb3IoaT0oMCk7aTwoTik7aSsrKXsKICAgICAgaWYoZFtpXTwwKXsKICAgICAgICByZXNbc3orK10gPSAtZFtpXTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHN6OwogIH0KICBpbmxpbmUgaW50IGNvbXAoaW50IHJlc1tdLCB2b2lkICptZW0gPSB3bWVtKXsKICAgIGludCBpOwogICAgaW50IHN6PTA7CiAgICBpbnQqY250OwogICAgd2FsbG9jMWQoJmNudCwgTiwgJm1lbSk7CiAgICBmb3IoaT0oMCk7aTwoTik7aSsrKXsKICAgICAgY250W2ldID0gMDsKICAgIH0KICAgIGZvcihpPSgwKTtpPChOKTtpKyspewogICAgICBjbnRbZ2V0KGkpXSA9IDE7CiAgICB9CiAgICBmb3IoaT0oMCk7aTwoTik7aSsrKXsKICAgICAgaWYoY250W2ldKXsKICAgICAgICBjbnRbaV0gPSBzeisrOwogICAgICB9CiAgICB9CiAgICBmb3IoaT0oMCk7aTwoTik7aSsrKXsKICAgICAgcmVzW2ldID0gY250W2dldChpKV07CiAgICB9CiAgICByZXR1cm4gc3o7CiAgfQp9CjsKc3RydWN0IGRpbWNvbXAyewogIGludCBCOwogIGRpbWNvbXAyKCl7CiAgfQogIGRpbWNvbXAyKGludCBiKXsKICAgIEIgPSBiOwogIH0KICBkaW1jb21wMihpbnQgYSwgaW50IGIpewogICAgQiA9IGI7CiAgfQogIGlubGluZSB2b2lkIHNldChpbnQgYil7CiAgICBCID0gYjsKICB9CiAgaW5saW5lIHZvaWQgc2V0KGludCBhLCBpbnQgYil7CiAgICBCID0gYjsKICB9CiAgaW5saW5lIGludCBtYXNrKGludCBhLCBpbnQgYil7CiAgICByZXR1cm4gYSAqIEIgKyBiOwogIH0KICBpbmxpbmUgaW50IG9wZXJhdG9yKCkoaW50IGEsIGludCBiKXsKICAgIHJldHVybiBhICogQiArIGI7CiAgfQogIGlubGluZSB2b2lkIHBhcmEoaW50IG1hc2ssIGludCAmYSwgaW50ICZiKXsKICAgIGEgPSBtYXNrIC8gQjsKICAgIGIgPSBtYXNrICUgQjsKICB9CiAgaW5saW5lIHZvaWQgb3BlcmF0b3IoKShpbnQgbWFzaywgaW50ICZhLCBpbnQgJmIpewogICAgYSA9IG1hc2sgLyBCOwogICAgYiA9IG1hc2sgJSBCOwogIH0KfQo7CiNkZWZpbmUgbWFpbiBkdW1teV9tYWluCmludCBtYWluKCl7CiAgd21lbSA9IG1lbWFycjsKICByZXR1cm4gMDsKfQojdW5kZWYgbWFpbgpjbGFzcyBTb2x1dGlvbnsKICBwdWJsaWM6CiAgaW50IGxhdGVzdERheVRvQ3Jvc3MoaW50IFgsIGludCBZLCB2ZWN0b3I8dmVjdG9yPGludD4+JiBjZWxscyl7CiAgICBpbnQgazsKICAgIGR1bW15X21haW4oKTsKICAgIGludCBpOwogICAgaW50IGo7CiAgICBpbnQgZCA9IFggKiBZOwogICAgaW50KipzOwogICAgaW50IG5vZGUgPSBkOwogICAgaW50IHN0ID0gbm9kZSsrOwogICAgaW50IGVkID0gbm9kZSsrOwogICAgdW5pb25GaW5kIHVmOwogICAgZGltY29tcDIgZG0oWCxZKTsKICAgIHVmLndhbGxvYyhub2RlLDEpOwogICAgd2FsbG9jMmQoJnMsIFgsIFkpOwogICAgZm9yKGk9KDApO2k8KFgpO2krKyl7CiAgICAgIGZvcihqPSgwKTtqPChZKTtqKyspewogICAgICAgIHNbaV1bal0gPSAwOwogICAgICB9CiAgICB9CiAgICBmb3Ioaz0oZCktMTtrPj0oMCk7ay0tKXsKICAgICAgaW50IG5pLCBuajsKICAgICAgYXV0byBGbWNLcEZtTiA9ICgoY2VsbHNba11bMF0pLSAxKTsKICAgICAgYXV0byB4cjIwc2h4WSA9ICgoIGNlbGxzW2tdWzFdKS0gMSk7CiAgICAgIGk9Rm1jS3BGbU47CiAgICAgIGo9eHIyMHNoeFk7CiAgICAgIHNbaV1bal0gPSAxOwogICAgICBzdGF0aWMgaW50IFdZSUdJY0dFWzRdID0gey0xLCAwLCAwLCAxfTsKICAgICAgc3RhdGljIGludCB0X3luTVNkZ1s0XSA9IHswLCAtMSwgMSwgMH07CiAgICAgIGludCBLcmRhdGxZVjsKICAgICAgZm9yKEtyZGF0bFlWPSgwKTtLcmRhdGxZVjwoNCk7S3JkYXRsWVYrKyl7CiAgICAgICAgbmkgPSAoaSkgKyBXWUlHSWNHRVtLcmRhdGxZVl07CiAgICAgICAgbmogPSAoaikgKyB0X3luTVNkZ1tLcmRhdGxZVl07CiAgICAgICAgaWYoMCA8PSBuaiAgJiYgIG5qIDwgWSl7CiAgICAgICAgICBpZihuaSA9PSAtMSl7CiAgICAgICAgICAgIHVmKGRtKGksaiksIHN0KTsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9CiAgICAgICAgICBpZihuaSA9PSAgWCl7CiAgICAgICAgICAgIHVmKGRtKGksaiksIGVkKTsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9CiAgICAgICAgICBpZihzW25pXVtual0pewogICAgICAgICAgICB1ZihkbShpLGopLCBkbShuaSxuaikpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICBpZih1ZihzdCkgPT0gdWYoZWQpKXsKICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGs7CiAgfQp9CjsKLy8gY0xheSB2ZXJzaW9uIDIwMjEwODE2LTEKCi8vIC0tLSBvcmlnaW5hbCBjb2RlIC0tLQovLyAjZGVmaW5lIG1haW4gZHVtbXlfbWFpbgovLyB7fQovLyAjdW5kZWYgbWFpbgovLyAKLy8gY2xhc3MgU29sdXRpb24gewovLyBwdWJsaWM6Ci8vICAgaW50IGxhdGVzdERheVRvQ3Jvc3MoaW50IFgsIGludCBZLCB2ZWN0b3I8dmVjdG9yPGludD4+JiBjZWxscykgewovLyAgICAgZHVtbXlfbWFpbigpOwovLyAgICAgaW50IGksIGosIGQgPSBYICogWSwgKipzOwovLyAgICAgaW50IG5vZGUgPSBkLCBzdCA9IG5vZGUrKywgZWQgPSBub2RlKys7Ci8vICAgICB1bmlvbkZpbmQgdWY7Ci8vICAgICBkaW1jb21wMiBkbShYLFkpOwovLyAKLy8gICAgIHVmLndhbGxvYyhub2RlLDEpOwovLyAgICAgd2FsbG9jMmQoJnMsIFgsIFkpOwovLyAgICAgcmVwKGksWCkgcmVwKGosWSkgc1tpXVtqXSA9IDA7Ci8vIAovLyAgICAgcnJlcChrLGQpewovLyAgICAgICAoaSwgaikgPSAoY2VsbHNba11bMF0sIGNlbGxzW2tdWzFdKSAtIDE7Ci8vICAgICAgIHNbaV1bal0gPSAxOwovLyAgICAgICByZXBfZGlzdChuaSxuaixpLGopIGlmKDAgPD0gbmogPCBZKSB7Ci8vICAgICAgICAgaWYobmkgPT0gLTEpIHVmKGRtKGksaiksIHN0KSwgY29udGludWU7Ci8vICAgICAgICAgaWYobmkgPT0gIFgpIHVmKGRtKGksaiksIGVkKSwgY29udGludWU7Ci8vICAgICAgICAgaWYoc1tuaV1bbmpdKSB1ZihkbShpLGopLCBkbShuaSxuaikpOwovLyAgICAgICB9Ci8vICAgICAgIGlmKHVmKHN0KSA9PSB1ZihlZCkpIGJyZWFrOwovLyAgICAgfQovLyAgICAgcmV0dXJuIGs7Ci8vICAgfQovLyB9Owo=