Cod sursa(job #3230188)

Utilizator Alex_AeleneiAlex Aelenei Ioan Alex_Aelenei Data 19 mai 2024 20:45:42
Problema Plantatie Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.34 kb
#include <cmath>
#include <fstream>
#include <iostream>

using namespace std;

const int NMAX = 5e2;
int mx[10][NMAX + 5][NMAX + 5];
// mx[k][i][j] -> holds maximum value for squares of size (1 << k) with top left corner at line i, column j

int main()
{
    ifstream cin("plantatie.in");
    ofstream cout("plantatie.out");

    int n, m, x, y, z;
    cin >> n >> m;
    for (int lineIndex = 1; lineIndex <= n; lineIndex++)
        for (int columnIndex = 1; columnIndex <= n; columnIndex++)
            cin >> mx[0][lineIndex][columnIndex];

    for (int dimension = 1; dimension <= (int)log2(n); dimension++)
        for (int lineIndex = 1; lineIndex <= n - (1 << dimension) + 1; lineIndex++)
            for (int columnIndex = 1; columnIndex <= n - (1 << dimension) + 1; columnIndex++)
            {
                mx[dimension][lineIndex][columnIndex] = numeric_limits<int>::min();
                for (int configuration = 0; configuration < 4; configuration++)
                {
                    int newLineIndex = lineIndex + ((configuration & (1 << 0)) != 0) * (1 << (dimension - 1));
                    int newColumnIndex = columnIndex + ((configuration & (1 << 1)) != 0) * (1 << (dimension - 1));
                    mx[dimension][lineIndex][columnIndex] = max(mx[dimension][lineIndex][columnIndex], mx[dimension - 1][newLineIndex][newColumnIndex]);
                }
            }

    for (int dimension = 0; dimension <= (int)log2(n); dimension++)
    {
        for (int lineIndex = 1; lineIndex <= n - (1 << dimension) + 1; lineIndex++)
        {
            for (int columnIndex = 1; columnIndex <= n - (1 << dimension) + 1; columnIndex++)
                cout << mx[dimension][lineIndex][columnIndex] << " ";
            cout << endl;
        }
        cout << endl;
    }

    for (int queryIndex = 1; queryIndex <= m; queryIndex++)
    {
        cin >> x >> y >> z;
        int dimension = ceil(log2(z));

        int result = numeric_limits<int>::min();
        for (int configuration = 0; configuration < 4; configuration++)
        {
            int lineIndex = x + ((configuration & (1 << 0)) != 0) * (z - (1 << (dimension - 1)));
            int columnIndex = y + ((configuration & (1 << 1)) != 0) * (z - (1 << (dimension - 1)));
            result = max(result, mx[dimension - 1][lineIndex][columnIndex]);
        }
        cout << result << endl;
    }
    return 0;
}