Cod sursa(job #3330644)

Utilizator mirceamaierean41Mircea Maierean mirceamaierean41 Data 20 decembrie 2025 19:11:56
Problema Plantatie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.57 kb
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream fin("plantatie.in");
ofstream fout("plantatie.out");
// #define fin cin
// #define fout cout
vector<vector<int>> v;
vector<int> lg;
vector<vector<vector<int>>> m;
int n, x, y, z, q, k;
const int inf = 1 << 30;
int main()
{
    fin >> n >> q;
    v.resize(n + 1, vector<int>(n + 1));
    lg.resize(n + 1);
    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= n; j++)
            fin >> v[i][j];

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

    m.resize(lg[n] + 1, vector<vector<int>>(n + 1, vector<int>(n + 1)));
    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= n; j++)
            m[0][i][j] = v[i][j];

    for (int k = 1; (1 << k) <= n; k++)
    {
        for (int i = 1; i + (1 << k) <= n + 1; i++)
        {
            for (int j = 1; j + (1 << k) <= n + 1; j++)
            {
                m[k][i][j] = max(m[k - 1][i][j], m[k - 1][i][j + (1 << (k - 1))]);
                m[k][i][j] = max(m[k][i][j], m[k - 1][i + (1 << (k - 1))][j]);
                m[k][i][j] = max(m[k][i][j], m[k - 1][i + (1 << (k - 1))][j + (1 << (k - 1))]);
            }
        }
    }
    for (int i = 1; i <= q; i++)
    {
        fin >> x >> y >> z;
        int xi = x + z - 1;
        int yi = y + z - 1;
        k = lg[z];
        int ans = -inf;
        ans = max(m[k][x][y], m[k][x][yi - (1 << k) + 1]);
        ans = max(ans, m[k][xi - (1 << k) + 1][y]);
        ans = max(ans, m[k][xi - (1 << k) + 1][yi - (1 << k) + 1]);
        fout << ans << '\n';
    }
    return 0;
}