Cod sursa(job #2400702)

Utilizator Teo_1101Mititelu Teodor Teo_1101 Data 9 aprilie 2019 01:16:48
Problema Plantatie Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.35 kb
#include <iostream>
#include <fstream>

using namespace std;

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

const int NMAX = 501;

int N, Q;
int rmq[10][NMAX][NMAX];
int log[NMAX];

void Read()
{
    fin >> N >> Q;

    for(int i = 1; i <= N; ++i)
        for(int j = 1; j <= N; ++j)
        fin >> rmq[0][i][j];

    log[2] = 1;
    for(int i = 3; i <= N; ++i)
        log[i] = log[i/2] + 1;

    for(int l = 1; ( 1 << l ) <= N; ++l)
        for(int i = 1; i <= N - ( 1 << l ) + 1; ++i)
        for(int j = 1; j <= N - ( 1 << l ) + 1; ++j)
    {
        int A = max(rmq[l-1][i][j], rmq[l-1][i+(1<<(l-1))][j+(1<<(l-1))]);
        int B = max(rmq[l-1][i+(1<<(l-1))][j], rmq[l-1][i][j+(1<<(l-1))]);

        rmq[l][i][j] = max(A, B);
    }

    /*for(int l = 0; (1 << l) <= N; ++l){
    for(int i = 1; i <= N - ( 1 << l ) + 1; ++i){
        for(int j = 1; j <= N - ( 1 << l ) + 1; ++j)
        fout << rmq[l][i][j] << ' ';
        fout << '\n';
    }
    fout << "\n\n";
    }*/

    int i, j, l;

    for(int q = 1; q <= Q; ++q)
    {
        fin >> i >> j >> l;
        l = log[l];

        int A = max(rmq[l][i][j], rmq[l][i+(1<<l)-1][j+(1<<l)-1]);
        int B = max(rmq[l][i+(1<<l)-1][j], rmq[l][i][j+(1<<l)-1]);

        fout << max(A, B) << '\n';
    }
}
int main()
{
    Read();
    return 0;
}