Cod sursa(job #3349701)

Utilizator Commander_XDunel Stefan-Octavian Commander_X Data 1 aprilie 2026 19:48:43
Problema Plantatie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.47 kb
#include <fstream>
#include <vector>

std::ifstream fin("plantatie.in");
std::ofstream fout("plantatie.out");

using namespace std;

vector<vector<vector<int>>> RMQ;
vector<int> E;
int N,Q;

int main()
{
    fin >> N >> Q;
    RMQ.resize(10,vector<vector<int>>(N+1,vector<int>(N+1,0)));
    E.resize(N+1,0);

    for(int i = 1;i <= N; ++i)
        for(int j = 1; j <= N; ++j)
            fin >> RMQ[0][i][j];

    int i2,j2;
    for(int p = 1,lat = 2; lat <= N; p++, lat*=2)
        for(int i1 = 1; i1 <= N - lat + 1; ++i1)
            for(int j1 = 1; j1 <= N - lat + 1; ++j1)
            {
                i2 = i1 + (lat >> 1);
                j2 = j1 + (lat >> 1);
                RMQ[p][i1][j1] = max(RMQ[p][i1][j1],RMQ[p-1][i1][j1]);
                RMQ[p][i1][j1] = max(RMQ[p][i1][j1],RMQ[p-1][i2][j1]);
                RMQ[p][i1][j1] = max(RMQ[p][i1][j1],RMQ[p-1][i1][j2]);
                RMQ[p][i1][j1] = max(RMQ[p][i1][j1],RMQ[p-1][i2][j2]);
            }

    E[1] = 0;
    for(int i = 2;i <= N; ++i)
        E[i] = 1 + E[i/2];

    int i1,j1,k,len,L,maxim = 0;
    while(Q--)
    {
        maxim = 0;
        fin >> i1 >> j1 >> L;
        k = E[L];
        len = (1 << k);

        i2 = i1 + L - len;
        j2 = j1 + L - len;

        maxim = max(maxim,RMQ[k][i1][j1]);
        maxim = max(maxim,RMQ[k][i2][j1]);
        maxim = max(maxim,RMQ[k][i1][j2]);
        maxim = max(maxim,RMQ[k][i2][j2]);
        fout << maxim << '\n';
    }
}