Cod sursa(job #1044670)

Utilizator jul123Iulia Duta jul123 Data 30 noiembrie 2013 11:07:20
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.38 kb
#include<iostream>
#include<cstdio>

using namespace std;

int maxpow[505], d[9][505][505];
void precalculez()
{
    maxpow[1] = 0;
    for(int i = 2; i <= 505; i ++)
        maxpow[i]=maxpow[i/2] + 1;
}
int main()
{
    FILE *fin, *fout;
    fin = fopen("plantatie.in", "r");
    fout=fopen("plantatie.out", "w");

    int i, n, m, j, l, lg, x, y, h;

    precalculez();
    fscanf(fin, "%d %d", &n, &m);
    for(i = 1; i <= n; i ++)
        for(j = 1; j <= n; j ++)
            fscanf(fin, "%d", &d[0][i][j]);
    lg=maxpow[n];
    int maxim;
    for(l = 1; l <= lg; l ++)
        for(i = 1; i+(1<<(l-1)) <= n; i ++)
            for(j = 1; j+(1<<(l-1)) <= n; j ++)
                {
                d[l][i][j]=d[l-1][i][j];
                d[l][i][j]=max(d[l - 1][i][j], d[l - 1][i + (1<<(l - 1))][j]);
                d[l][i][j]=max(d[l][i][j], d[l - 1][i][j + (1 << (l - 1))]);
                d[l][i][j]=max(d[l][i][j], d[l - 1][i + (1 << (l - 1))][j + (1 << ( l - 1))]);
                }


    for(i = 0 ; i < m; i ++)
    {
        fscanf(fin, "%d %d %d", &x, &y, &h);
        maxim=max(d[maxpow[h]][x][y], d[maxpow[h]][ x + h - (1<<maxpow[h]) ][y]);
        maxim=max(maxim, d[maxpow[h]][x][ y + h -(1 << maxpow[h])]);
        maxim=max(maxim, d[maxpow[h]][x + h - (1<<maxpow[h])][y + h - (1<<maxpow[h])] );
        fprintf(fout, "%d\n", maxim);
    }
    }