Cod sursa(job #2754425)

Utilizator bananamandaoneTudor Cosmin Oanea bananamandaone Data 25 mai 2021 19:44:04
Problema Plantatie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.83 kb
#include <bits/stdc++.h>

using namespace std;

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

int n, q;
// log2 500 = 8.9
int rmq[503][503][10];

void citire()
{
    int i, j;
    fin >> n >> q;
    for(i = 1; i <= n; i++)
        for(j = 1; j <= n; j++)
            fin >> rmq[i][j][0]; // pun maximele din patratele de lg 1 direct
}

void matrice()
{
    /// rmq[i][j][k] = elementul maxim din patratul
    /// care incepe in (i, j) si are latura 2^k

    int i, j, k, lungime;

    for(k = 1; (1 << k) <= n; k++) // iau pe rand puterile lui 2
        for(i = 1; i <= n - (1 << k) + 1; i++) // iau pe rand coltul din stanga sus (i, j)
            for(j = 1; j <= n - (1 << k) + 1; j++)
            {
                lungime = 1 << (k - 1);
                rmq[i][j][k] = max( rmq[i][j][k - 1], max(
                                    rmq[i + lungime][j][k - 1], max(
                                    rmq[i][j + lungime][k - 1],
                                    rmq[i + lungime][j + lungime][k - 1] )));
            }
}

int logaritm2(int x)
{
    int i;
    for(i  = 0; 1 << i <= x; i++) ;
    return (i - 1);
}

void rezolvare()
{
    int i, j, k, sol, lglat, putere2;
    for(;q--;)
    {
        fin >> i >> j >> k;

        // lglat = log din lungimea laturii
        // putere2 = cea mai mica putere a lui doi <= k
        lglat = logaritm2(k);
        putere2 = 1 << lglat;
        sol = max( rmq[i][j][lglat], max(
                   rmq[i + k - putere2][j][lglat], max(
                   rmq[i][j + k - putere2][lglat],
                   rmq[i + k - putere2][j + k - putere2][lglat]
                   )));

        fout << sol << "\n";
    }
}

int main()
{
    citire();
    matrice();
    rezolvare();

    fin.close();
    fout.close();
    return 0;
}