Cod sursa(job #3261940)

Utilizator AndreiNicolaescuEric Paturan AndreiNicolaescu Data 7 decembrie 2024 20:00:08
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) < 10; p++)
        for(int i=1; i + (1 << (p))  <= n + 1; i++)
            for(int j=1; j + (1 << (p))  <= n + 1; 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<=10; 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(10);
    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 = x + z - len;
        int jnou = 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;
}