Cod sursa(job #784128)

Utilizator dutzulBodnariuc Dan Alexandru dutzul Data 4 septembrie 2012 23:00:20
Problema Plantatie Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.32 kb
//aint 2D
#include <fstream>
#define line 1
#define colomn 0
#define inf 1<<30
#define LE 570
using namespace std;
ifstream f ( "plantatie.in" );
ofstream g ( "plantatie.out" );
int i, n, m, j, Xquery, Yquery, result, k, Arb[LE*LE*6], A[LE][LE];

void Push ( int stLinie, int drLinie, int stColoana, int drColoana, int Typ, int Poz )
{
    int mijloc = Typ == line ? ( stLinie + drLinie ) / 2 : ( stColoana + drColoana ) / 2;

    Arb[Poz] = A[i][j] > Arb[Poz] ? A[i][j] : Arb[Poz];

    if (stLinie==drLinie&&stColoana==drColoana) return;

    if ( Typ == line )
    {
        if ( i <= mijloc )
            Push ( stLinie, mijloc, stColoana, drColoana, colomn, Poz * 2 );

        else Push ( mijloc + 1, drLinie, stColoana, drColoana, colomn, Poz * 2 + 1 );
    }

    else
    {
        if ( j <= mijloc )
            Push ( stLinie, drLinie, stColoana, mijloc, line, 2 * Poz );

        else Push ( stLinie, drLinie, mijloc + 1, drColoana, line, 2 * Poz + 1 );
    }
}

///////
void Query ( int stLinie, int drLinie, int stColoana, int drColoana, int Typ, int Poz )
{
    int mijloc = Typ == line ? ( stLinie + drLinie ) / 2 : ( stColoana + drColoana ) / 2;

    if ( stLinie >= Xquery && drLinie <= Xquery + k && stColoana >= Yquery && drColoana <= Yquery + k )
    {
        result = result < Arb[Poz] ? Arb[Poz] : result;
        return ;
    }

    if ( Typ == line )
    {
        if ( Xquery <= mijloc )
            Query ( stLinie, mijloc, stColoana, drColoana, colomn, 2 * Poz );

        if ( Xquery + k > mijloc )
            Query ( mijloc + 1, drLinie, stColoana, drColoana, colomn, 2 * Poz + 1 );
    }
    else
    {
        if ( Yquery <= mijloc )
            Query ( stLinie, drLinie, stColoana, mijloc, line, 2 * Poz );

        if ( Yquery + k > mijloc )
            Query ( stLinie, drLinie, mijloc + 1, drColoana, line, 2 * Poz + 1 );
    }

}

int main()
{
    f >> n >> m;

    for ( i = 1; i <= n; ++i )
        for ( j = 1; j <= n; ++j )
        {
            f >> A[i][j];
            Push ( 1, n, 1, n, 1, 1 );
        }

    for ( i = 1; i <=m; ++i )
    {
        f >> Xquery >> Yquery >> k;
        k--;
        result = -inf;
        Query ( 1, n, 1, n, 1, 1 );
        g << result << '\n';
    }


    f.close();
    g.close();
    return 0;
}