Cod sursa(job #2347647)

Utilizator bogdanvladmihaiBogdan Vlad-Mihai bogdanvladmihai Data 18 februarie 2019 22:42:25
Problema Plantatie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.29 kb
#include <bits/stdc++.h>
#define MAX 500

using namespace std;

int RMQ[32][MAX][MAX];
int N;
int max4(int a, int b, int c, int d){
    int mmax = max(a, b);
    mmax = max(mmax, c);
    mmax = max(mmax, d);
    return mmax;
}
void rangeminimumquery(){
    for (int k = 1; (1 << k) <= N; ++k){
        for (int i = N - (1 << k) + 1; i >= 1; --i){
            for (int j = N - (1 << k) + 1; j >= 1; --j){
                int rq = (1 << (k - 1));
                RMQ[k][i][j] = max4(RMQ[k - 1][i][j], RMQ[k - 1][i + rq][j], RMQ[k - 1][i][j + rq], RMQ[k - 1][i + rq][j + rq]);
            }
        }
    }
}
int solve(int x, int y, int k){
    int l = log2(k);
    int rq = (1 << l);
    int mmax = max4(RMQ[l][x][y], RMQ[l][x + k - rq][y], RMQ[l][x][y + k - rq], RMQ[l][x + k - rq][y + k - rq]);
    return mmax;
}
int main(){
    freopen("plantatie.in", "r", stdin);
    freopen("plantatie.out", "w", stdout);
    int Q;
    scanf("%d%d", &N, &Q);
    for (int i = 1; i <= N; ++i){
        for (int j = 1; j <= N; ++j){
            scanf("%d", &RMQ[0][i][j]);
        }
    }
    rangeminimumquery();
    for (int i = 1; i <= Q; ++i){
        int line, col, k;
        scanf("%d%d%d", &line, &col, &k);
        printf("%d\n", solve(line, col, k));
    }
    return 0;
}