Cod sursa(job #3225095)

Utilizator prares06Papacioc Rares-Ioan prares06 Data 16 aprilie 2024 21:35:24
Problema Plantatie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.43 kb
#include<bits/stdc++.h>

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

const int MAX = 505;
const int LOG_MAX = 10;
int n, m, x, y, z, rmq[LOG_MAX][MAX][MAX], E[MAX];

struct RMQ{
    void init(){
        fin >> n >> m;
        for(int i = 1; i <= n; ++i)
            for(int j = 1; j <= n; ++j)
                fin >> rmq[0][i][j];

        for(int i = 1; (1 << i) <= n; ++i)
            for(int j = 1; j <= n; ++j)
        for(int k = 1; k <= n; ++k){
            rmq[i][j][k] = rmq[i - 1][j][k];
            int dl = j + (1 << (i - 1)), dc = k + (1 << (i - 1));
            if(dl <= n and rmq[i - 1][dl][k] > rmq[i][j][k])
                rmq[i][j][k] = rmq[i - 1][dl][k];
            if(dc <= n and rmq[i - 1][j][dc] > rmq[i][j][k])
                rmq[i][j][k] = rmq[i - 1][j][dc];
            if(dl <= n and dc <= n and rmq[i - 1][dl][dc] > rmq[i][j][k])
                rmq[i][j][k] = rmq[i - 1][dl][dc];
        }

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

    void query(){
        fin >> x >> y >> z;
        int e = E[z];
        fout << std::max(std::max(rmq[e][x][y], rmq[e][x][y + z - (1 << e)]), std::max(rmq[e][x + z - (1 << e)][y], rmq[e][x + z - (1 << e)][y + z - (1 << e)])) << '\n';
    }

    void solve_queries(){
        for(;m;--m)
            query();
    }
} R;

int main(){
    R.init();
    R.solve_queries();
}