Cod sursa(job #2158405)

Utilizator FrequeAlex Iordachescu Freque Data 10 martie 2018 12:45:24
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.25 kb
#include <iostream>
#include <fstream>
#include <cmath>

using namespace std;

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

const int NMAX = 500 + 5;
const int PMAX = log2(NMAX) + 3;

int n, m, x, y, l;
int rmq[NMAX][NMAX][PMAX];

int max4(int a, int b, int c, int d)
{
    int max1 = max(a, b);
    int max2 = max(c, d);
    return max(max1, max2);
}

void build()
{
    for (int k = 1; k <= log2(n); ++k)
        for (int i = 1; i + (1 << k) - 1 <= n; ++i)
            for (int j = 1; j + (1 << k) - 1 <= n; ++j)
                rmq[i][j][k] = max4(rmq[i][j][k - 1], rmq[i + (1 << (k - 1))][j][k - 1], rmq[i][j + (1 << (k - 1))][k - 1], rmq[i + (1 << (k - 1))][j + (1 << (k - 1))][k - 1]);
}

int query(int x, int y, int k)
{
    int loga = (int)log2(k);
    return max4(rmq[x][y][loga], rmq[x + k - (1 << loga)][y][loga], rmq[x][y + k - (1 << loga)][loga], rmq[x + k - (1 << loga)][y + k - (1 << loga)][loga]);
}

void read()
{
    fin >> n >> m;
    for (int i = 1; i <= n; ++i)
        for (int j = 1; j <= n; ++j)
            fin >> rmq[i][j][0];
}

int main()
{
    read();
    build();

    while (m--)
    {
        fin >> x >> y >> l;
        fout << query(x, y, l) << '\n';
    }

    return 0;
}