Pagini recente » Cod sursa (job #1440814) | Cod sursa (job #1272285) | Cod sursa (job #2057018) | Cod sursa (job #1440524) | Cod sursa (job #2964263)
#include <algorithm>
#include <fstream>
#include <cstring>
using namespace std;
ifstream cin( "matrice2.in" );
ofstream cout( "matrice2.out" );
struct Nod {
int l, c;
int val;
};
struct Query {
int x1, y1;
int x2, y2;
int poz, rez;
};
const int MAX = 333;
const int MAXN = MAX * MAX;
int a[ MAX ][ MAX ];
Query Q[ 20011 ];
int dad[ MAXN ];
Nod v[ MAXN ];
int n, q;
int Tata( int x ) {
if( dad[ x ] == x )
return x;
return dad[ x ] = Tata( dad[ x ] );
}
int dl[] = { 0, 1, 0, -1 };
int dc[] = { 1, 0, -1, 0 };
void add( const int& l, const int& c ) {
dad[ a[ l ][ c ] ] = a[ l ][ c ];
for( int d = 0; d < 4; d++ )
if( dad[ a[ l + dl[ d ] ][ c + dc[ d ] ] ] )
dad[ Tata( dad[ a[ l + dl[ d ] ][ c + dc[ d ] ] ] ) ] = a[ l ][ c ];
}
int main()
{
int pp = 0;
cin >> n >> q;
for( int i = 1; i <= n; i++ )
for( int j = 1; j <= n; j++ ) {
cin >> v[ ++pp ].val;
a[ i ][ j ] = pp;
v[ pp ].l = i;
v[ pp ].c = j;
}
for( int i = 1; i <= q; i++ ) {
cin >> Q[ i ].x1 >> Q[ i ].y1 >> Q[ i ].x2 >> Q[ i ].y2;
Q[ i ].poz = i;
}
sort( v + 1, v + pp + 1, []( const Nod& A, const Nod& B ) {
return A.val > B.val;
} );
for( int pas = ( 1 << 19 ); pas; pas >>= 1 ) {
memset( dad, 0, sizeof dad );
sort( Q + 1, Q + q + 1, []( const Query& A, const Query& B ) {
return A.rez > B.rez;
} );
int j = 1;
for( int i = 1; i <= q; i++ ) {
// printf( "val = %d\n", Q[ i ].rez );
while( Q[ i ].rez + pas <= v[ j ].val ) {
add( v[ j ].l, v[ j ].c );
//printf("%d %d\n", v[ j ].l, v[ j ].c );
++j;
}
int A = Tata( a[ Q[ i ].x1 ][ Q[ i ].y1 ] );
int B = Tata( a[ Q[ i ].x2 ][ Q[ i ].y2 ] );
// cout << A << ' ' << B << '\n';
if( A == B && A )
Q[ i ].rez += pas;
}
}
sort( Q + 1, Q + q + 1, []( const Query& A, const Query& B ) {
return A.poz < B.poz;
} );
//cout<< "\n\n\n\n";
for( int i = 1; i <= q; i++ )
cout << Q[ i ].rez << '\n';
return 0;
}