Cod sursa(job #1512255)

Utilizator BLz0rDospra Cristian BLz0r Data 27 octombrie 2015 20:38:22
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.61 kb
#include <fstream>
#include <algorithm>
#include <string>
using namespace std;

#define Nmax 502
#define LogN 10

ifstream fin ( "plantatie.in" );
ofstream fout ( "plantatie.out" );

int N, RMQ[Nmax][Nmax][LogN], Log2[Nmax];

void RMQ_process(){

    for ( int k = 1; ( 1<<k ) <= N; ++k ){
        int a = ( 1<<k );
        int b = ( 1<<(k-1) );
        for ( int i = 1; i <= N-a+1; ++i ){
            for ( int j = 1; j <= N-a+1; ++j ){
                RMQ[i][j][k] = max ( max ( RMQ[i][j][k-1], RMQ[i+b][j][k-1] ), max ( RMQ[i][j+b][k-1], RMQ[i+b][j+b][k-1] ) );
            }
        }
    }
}

int RMQ_query ( int x, int y, int lat ){

    int k = Log2[lat];
    int t = 1 << k;
    int dif = lat - t;

    return max ( max ( RMQ[x][y][k], RMQ[x+dif][y+dif][k] ), max ( RMQ[x+dif][y][k], RMQ[x][y+dif][k] ) );

}

string Buffer;
string :: iterator it;

int ReadInt(){

    while ( *it < '0' || *it > '9' )
        it++;

    int nr = 0;

    while ( *it >= '0' && *it <= '9' ){
        nr = nr * 10 + ( *it-'0' );
        it++;
    }

    return nr;
}

int main(){

    int Q;

    getline ( fin, Buffer, char(0) );
    it = Buffer.begin();

    N = ReadInt();
    Q = ReadInt();

    for ( int i = 2; i <= N; ++i )
        Log2[i] = Log2[i>>1]+1;

    for ( int i = 1; i <= N; ++i )
        for ( int j = 1; j <= N; ++j )
            RMQ[i][j][0] = ReadInt();

    RMQ_process();

    int x, y, z;
    while ( Q-- ){
        x = ReadInt();
        y = ReadInt();
        z = ReadInt();

        fout << RMQ_query( x, y, z ) << '\n';
    }

    return 0;
}