Cod sursa(job #1598700)

Utilizator AdrianaMAdriana Moisil AdrianaM Data 13 februarie 2016 11:17:27
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.2 kb
#include <fstream>
#include <vector>
using namespace std;

ifstream is("plantatie.in");
ofstream os("plantatie.out");

void Read();
void RMQ();
void Query();

int n, m;
int log2[501];
int r[501][501][10];

int main()
{
    Read();
    RMQ();
    Query();
    is.close();
    os.close();
    return 0;
}

void Query()
{
    int i, j, k, val;
    while ( m-- )
    {
        is >> i >> j >> k;
        val = log2[k];
        os << max(max(r[i][j][val], r[i + k - ( 1 << val )][j + k - ( 1 << val )][val]), max(r[i + k - ( 1 << val )][j][val], r[i][j + k - ( 1 << val )][val])) << "\n";
    }
}

void RMQ()
{
    for ( int i = 2; i <= n; ++i )
        log2[i] = log2[i / 2] + 1;
    for ( int k = 1; ( 1 << k ) <= n; ++k )
        for ( int i = 1; i + ( 1 << k ) - 1 <= n; ++i )
            for ( int j = 1; j + ( 1 << k ) - 1 <= n; ++j )
                r[i][j][k] = max(max(r[i][j][k - 1], r[i + ( 1 << ( k - 1 ) )][j + ( 1 << ( k - 1 ) )][k - 1]), max(r[i + ( 1 << ( k - 1 ) )][j][k - 1], r[i][j + ( 1 << ( k - 1 ) )][k - 1]));
}

void Read()
{
    is >> n >> m;
    for ( int i = 1; i <= n; ++i )
        for ( int j = 1; j <= n; ++j )
            is >> r[i][j][0];
}