Cod sursa(job #1991273)

Utilizator al.mocanuAlexandru Mocanu al.mocanu Data 15 iunie 2017 23:05:46
Problema Plantatie Scor 0
Compilator c Status done
Runda Arhiva de probleme Marime 1.28 kb
#include <stdio.h>
#define max(a, b) (((a) < (b)) ? (b) : (a))
#define MAX 505
#define NMAX 9

int n, m, x, y, k, rmq[NMAX][MAX][MAX];
int logg[MAX];

void constrRMQ(){
    for(int k = 1; k <= logg[n]; ++k){
        int depl = (1<<(k - 1));
        int prag = n - (1<<k) + 1;
        for(int i = 1; i <= prag; ++i)
            for(int j = 1; j <= prag; ++j){
                rmq[k][i][j] = max( max(rmq[k - 1][i][j], rmq[k - 1][i][j + depl]),
                                    max(rmq[k - 1][i + depl][j], rmq[k - 1][i + depl][j + depl]));
            }
    }
}

int query(int x, int y, int k){
    int d = logg[k], depl = k - (1<<d);

    return max( max(rmq[d][x][y], rmq[d][x][y + depl]),
                max(rmq[d][x + depl][y], rmq[d][x + depl][y + depl]));
}

int main(){
    freopen("plantatie.in", "r", stdin);
    freopen("plantatie.out", "w", stdout);
    scanf("%d%d", &n, &m);
    for(int i = 1; i <= n; ++i){
        for(int j = 1; j <= n; ++j){
            scanf("%d", &rmq[0][i][j]);
            printf("%d ", rmq[0][i][j]);
        }
        printf("\n");
    }

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

    constrRMQ();

    for(int i = 0; i < m; ++i){
        scanf("%d%d%d", &x, &y, &k);
        printf("%d\n", query(x, y, k));
    }
    return 0;
}