Cod sursa(job #2645887)

Utilizator AndreiAlexandru2k3Ciucan Andrei Alexandru AndreiAlexandru2k3 Data 29 august 2020 21:45:53
Problema Plantatie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.26 kb
#include <iostream>
#include <fstream>
using namespace std;

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

const int LMAX = 10,
          NMAX = 501;

int N, M,l;
int rmq[NMAX][NMAX][LMAX], lg[NMAX];

int main()
{
    f >> N >> M;
    for(int i = 1; i <= N; i++)
        for(int j = 1; j <= N; j++)
            f >> rmq[i][j][0];
    lg[1] = 0;
    for(int i = 2; i <= N; i++)
        lg[i] = lg[i / 2] + 1;
    for(int k = 1; (l=1<<k) <= N; k++)
        for(int i = 1; i <= N; i++)
            for(int j = 1; j <= N; j++)
            {
                rmq[i][j][k] = rmq[i][j][k - 1];
                int rez1=j+(l>>1),rez2=i+(l>>1);
                if(rez1 <= N)
                    rmq[i][j][k] = max(rmq[i][j][k], rmq[i][rez1][k - 1]);
                if(rez2 <= N)
                    rmq[i][j][k] = max(rmq[i][j][k], rmq[rez2][j][k - 1]);
                if(rez2 <= N && rez1 <= N)
                    rmq[i][j][k] = max(rmq[i][j][k], rmq[rez2][rez1][k - 1]);
            }
    while(M--)
    {
        int i, j, k;
        f >> i >> j >> k;
        int p = 1 << lg[k];
        g << max(rmq[i][j][lg[k]], max(rmq[i + k - p][j][lg[k]], max(rmq[i][j + k - p][lg[k]], rmq[i + k - p][j + k - p][lg[k]]))) << '\n';
    }
    return 0;
}