Cod sursa(job #2567215)

Utilizator AndreiJJIordan Andrei AndreiJJ Data 3 martie 2020 15:55:58
Problema Plantatie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.26 kb
#include <fstream>
#include <iostream>

using namespace std;

const int N = 505;
int a[N][N], rmq[10][N][N], exp[N], n;

void Build_RMQ()
{
    for (int i = 2; i <= n; i++)
        exp[i] = exp[i >> 1] + 1;
    for (int k = 1; k <= exp[n]; k++)
        for (int i = 1; i <= n - (1 << k) + 1; i++)
            for (int j = 1; j <= n - (1 << k) + 1; j++)
                rmq[k][i][j] = max(max(max(rmq[k - 1][i][j], rmq[k - 1][i + (1 << (k - 1))][j]),
                                       rmq[k - 1][i][j + (1 << (k - 1))]),
                                   rmq[k - 1][i + (1 << (k - 1))][j + (1 << (k - 1))]);
}

void Read ()
{
    ifstream fin ("plantatie.in");
    ofstream fout ("plantatie.out");
    int q;
    fin >> n >> q;
    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= n; j++)
        {
            fin >> a[i][j];
            rmq[0][i][j] = a[i][j];
        }
    Build_RMQ();
    while (q--)
    {
        int x, y, k;
        fin >> x >> y >> k;
        int l = exp[k];
        fout << max(max(max(rmq[l][x][y], rmq[l][x + k - (1 << l)][y]), rmq[l][x][y + k - (1 << l)]),
                    rmq[l][x + k - (1 << l)][y + k - (1 << l)]) << "\n";
    }
    fout.close();
}


int main()
{
    Read();
    return 0;
}