Cod sursa(job #2788935)

Utilizator Andrei_TudTudorache Andrei-Adrian Andrei_Tud Data 26 octombrie 2021 18:06:48
Problema Plantatie Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.23 kb
#include <iostream>
#include <fstream>

using namespace std;

#define NMAX 502
#define LMAX 10

long int rmq[NMAX][NMAX][LMAX];
long int n,m;
long int lg[NMAX];
long int a[NMAX][NMAX];

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

int main()
{
    int i, j, k;
    fin >> n >> m;
    for(i = 1; i <= n; i++)
        for(j = 1; j <= n; j++)
            fin >> a[i][j];

    lg[1] = 0;
    for(i = 2; i <= n; i++)
        lg[i] = lg[i/2] + 1;

    for(i = 1; i <= n; i++)
        for(j = 1; j <= n; j++)
            rmq[i][j][0] = a[i][j];
    for(k = 1; (1<<k) <= n; k++)
    {
        for(i = 1; i+(1<<k)-1 <= n; i++)
        {
            for(j = 1; j+(1<<k)-1 <= n; j++)
            {
                rmq[i][j][k] = max(max(rmq[i][j][k-1], rmq[i][j + (1<<(k-1))][k-1]), max(rmq[i + (1<<(k-1))][j][k-1], rmq[i + (1<<(k-1))][j + (1<<(k-1))][k-1]));
            }
        }
    }

    int x, y, l;
    for(int f = 1; f <= m; f++)
    {
        fin >> x >> y >> k;
        l = lg[k];
        int diffy = y + k - (1<<l); int diffx = x + k - (1<<l);
        fout << max(max(rmq[x][y][l], rmq[x][diffy][l]), max(rmq[diffx][y][l], rmq[diffx][diffy][l]));
        fout << endl;
    }
    return 0;
}