Cod sursa(job #1389073)

Utilizator smaraldaSmaranda Dinu smaralda Data 15 martie 2015 22:14:40
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.42 kb
#include<stdio.h>

const int LOG = 10, NMAX = 501;

int d[LOG][NMAX][NMAX], grid[NMAX][NMAX];

int max (int p, int q, int r, int s) {
    int res = p;
    if(q > res) res = q;
    if(r > res) res = r;
    if(s > res) res = s;
    return res;
}

int main() {
    freopen("plantatie.in", "r", stdin);
    freopen("plantatie.out", "w", stdout);
    int n, i, j, k, m, x, y, p2, lat, latQuery, half, xRight, yRight;

    scanf("%d%d", &n, &m);
    for(i = 1; i <= n; ++ i)
        for(j = 1; j <= n; ++ j)
            scanf("%d", &grid[i][j]);

    for(i = 1; i <= n; ++ i)
        for(j = 1; j <= n; ++ j)
            d[0][i][j] = grid[i][j];

    for(p2 = 1; (1 << p2) <= n; ++ p2) {
        lat = 1 << p2;

        for(i = 1; i <= n - lat + 1; ++ i)
            for(j = 1; j <= n - lat + 1; ++ j) {
                half = lat / 2;

                d[p2][i][j] = max(d[p2 - 1][i][j], d[p2 - 1][i + half][j + half], d[p2 - 1][i + half][j], d[p2 - 1][i][j + half]);
            }
    }

    for(i = 1; i <= m; ++ i) {
        scanf("%d%d%d", &x, &y, &latQuery);
        xRight = x + latQuery - 1;
        yRight = y + latQuery - 1;

        p2 = 0;
        while((1 << p2) <= latQuery)
            ++ p2;
        -- p2;

        lat = 1 << p2;
        printf("%d\n", max(d[p2][x][y], d[p2][x][yRight - lat + 1], d[p2][xRight - lat + 1][y], d[p2][xRight - lat + 1][yRight - lat + 1]));
    }
    return 0;
}