Cod sursa(job #2964263)

Utilizator andrei_marciucMarciuc Andrei andrei_marciuc Data 12 ianuarie 2023 18:52:19
Problema Matrice 2 Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.32 kb
#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;
}