Cod sursa(job #3261930)

Utilizator AndreiNicolaescuEric Paturan AndreiNicolaescu Data 7 decembrie 2024 19:52:54
Problema Plantatie Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.29 kb
#include <fstream>
#include <vector>
using namespace std;
ifstream cin("plantatie.in");
ofstream cout("plantatie.out");
vector<vector<vector<int>>> r;
vector<int> E;
int n, m, x, y, z;
void precalc()
{
    for(int p=1; (1<<p) <= n; p++)
        for(int i=1; i + (1 << p) - 1 <= n; i++)
            for(int j=1; j + (1 << p) - 1 <= n; j++)
            {
                int inou = i + (1 << (p-1));
                int jnou = j + (1 << (p-1));
                r[p][i][j] = r[p-1][i][j];

                r[p][i][j] = max(r[p][i][j], r[p-1][inou][j]);

                r[p][i][j] = max(r[p][i][j], r[p-1][i][jnou]);

                r[p][i][j] = max(r[p][i][j], r[p-1][inou][jnou]);
            }
    for(int i=2; i<=n; i++)
        E[i] = E[i / 2] + 1;
}
int main()
{
    cin >> n >> m;
    r.assign(10, vector<vector<int>>(n+1, vector<int>(n+1, 0)));

    E.resize(20);
    for(int i=1; i<=n; i++)
        for(int j=1; j<=n; j++)
            cin >> r[0][i][j];
    precalc();
    while(m--)
    {
        cin >> x >> y >> z;
        int k = E[z];
        int len = (1 << k);
        int inou = min(n, x + z - len);
        int jnou = min(n, y + z - len);

        cout << max(max(r[k][x][y], r[k][x][jnou]), max(r[k][inou][y], r[k][inou][jnou])) << '\n';
    }
    return 0;
}