Cod sursa(job #2347097)

Utilizator AndreiTurcasTurcas Andrei AndreiTurcas Data 18 februarie 2019 13:56:20
Problema Plantatie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.14 kb
#include <iostream>
#include <fstream>
#define lim 501
using namespace std;

ifstream f("plantatie.in");
ofstream g("plantatie.out");

int n, m, rmq[20][lim][lim], Lg[lim];

void preprocess()
{
    for(int i = 2; i <= n; ++i)
        Lg[i] = Lg[i>>1] + 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)
    {
        int f1, f2, f3, f4, p = 1<<(k-1);
        f1 = rmq[k-1][i][j];
        f2 = rmq[k-1][i][j+p];
        f3 = rmq[k-1][i+p][j];
        f4 = rmq[k-1][i+p][j+p];
        rmq[k][i][j] = max(max(f1, f2), max(f3, f4));
    }
}

int main()
{
    f >> n >> m;
    for(int i = 1; i <= n; ++i)
        for(int j = 1; j <= n; ++j)
            f >> rmq[0][i][j];
    preprocess();
    for(int i = 1; i <= m; ++i)
    {
        int x, y, z, lg, sol1, sol2, sol3, sol4, p;
        f >> x >> y >> z;
        lg = Lg[z-1], p = 1<<lg;
        sol1 = rmq[lg][x][y];
        sol2 = rmq[lg][x][y+z-p];
        sol3 = rmq[lg][x+z-p][y];
        sol4 = rmq[lg][x+z-p][y+z-p];
        g << max(max(sol1, sol2), max(sol3, sol4)) << "\n";
    }
}