Cod sursa(job #3173567)

Utilizator BuzdiBuzdugan Rares Andrei Buzdi Data 23 noiembrie 2023 10:35:33
Problema Plantatie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.56 kb
#include <fstream>

using namespace std;

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

const int NMAX = 500;
const int LOGMAX = 9;

int n, Q;
int a[NMAX + 1][NMAX + 1];
int RMQ[LOGMAX + 1][NMAX + 1][NMAX + 1];
int LOG[NMAX + 1];

int Maxim(int a, int b, int c, int d)
{
    int maxi = a;
    maxi = max(maxi, b);
    maxi = max(maxi, c);
    maxi = max(maxi, d);
    return maxi;
}

int main()
{
    cin >> n >> Q;
    for(int i = 1; i <= n; i++)
        for(int j = 1; j <= n; j++)
            cin >> a[i][j];

    for(int i = 1; i <= n; i++)
        for(int j = 1; j <= n; j++)
            RMQ[0][i][j] = a[i][j];

    for(int k = 1; (1 << k) <= n; k++)
        for(int i = 1; i + (1 << k) - 1 <= n; i++)
            for(int j = 1; j + (1 << k) - 1 <= n; j++)
            {
                int i1 = i;
                int j1 = j;
                int i2 = i + (1 << (k - 1));
                int j2 = j + (1 << (k - 1));
                RMQ[k][i][j] = Maxim(RMQ[k - 1][i1][j1], RMQ[k - 1][i1][j2], RMQ[k - 1][i2][j1], RMQ[k - 1][i2][j2]);
            }

    for(int i = 2; i <= n; i++)
        LOG[i] = LOG[i >> 1] + 1;

    while(Q--)
    {
        int i, j, l;
        cin >> i >> j >> l;
        int k = LOG[l];
        int i1 = i;
        int j1 = j;
        int i2 = i + l - 1;
        int j2 = j + l - 1;
        int answer = Maxim(RMQ[k][i1][j1], RMQ[k][i1][j2 - (1 << k) + 1], RMQ[k][i2 - (1 << k) + 1][j1], RMQ[k][i2 - (1 << k) + 1][j2 - (1 << k) + 1]);
        cout << answer << '\n';
    }

    return 0;
}