Cod sursa(job #2738899)

Utilizator pielevladutPiele Vladut Stefan pielevladut Data 6 aprilie 2021 14:56:50
Problema Plantatie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.53 kb
#include <bits/stdc++.h>

using namespace std;

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

int n, m;
int v[505][505][10];
int logaritm[505];

int dami_maximu_am_zis(int a, int b, int c, int d)
{
    int maxim = -1;
    maxim = max(maxim,a);
    maxim = max(maxim,b);
    maxim = max(maxim,c);
    maxim = max(maxim,d);
    return maxim;
}

void precalc()
{
    logaritm[1] = 0;
    for(int i = 2; i <= 500; i ++)
    {
        logaritm[i] = logaritm[i / 2] + 1;
    }
    for(int i = 1; i <= 9; i ++)
    {
        for(int j = 1; j + (1 << i) - 1 <= n; j ++)
        {
            for(int q = 1; q + (1 << i) - 1 <= n; q ++)
            {
                int p2 = (1 << (i-1));
                v[q][j][i] = dami_maximu_am_zis(v[q][j][i-1], v[q + p2][j][i-1], v[q][j + p2][i-1], v[q + p2][j + p2][i-1]);
            }
        }
    }
}

int rmq(int lin, int col, int lat)
{
    int logg = logaritm[lat];
    int lfinal = lin + lat - 1;
    int cfinal = col + lat - 1;
    return dami_maximu_am_zis(v[lin][col][logg], v[lfinal - (1<<logg) + 1][col][logg], v[lin][cfinal - (1<<logg) + 1][logg], v[lfinal - (1<<logg) + 1][cfinal - (1<<logg) + 1][logg]);
}

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

    precalc();

    while(m--)
    {
        int lin, col, lat;
        fin >> lin >> col >> lat;
        fout << rmq(lin,col,lat) << '\n';
    }
    return 0;
}