Cod sursa(job #580378)

Utilizator drywaterLazar Vlad drywater Data 13 aprilie 2011 00:59:08
Problema Plantatie Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.26 kb
#include <stdio.h>
int a[501][501][10],i,j,n,m,x,y,lg[501],l,k;
int main(void)
{
    freopen("plantatie.in","r",stdin);
    freopen("plantatie.out","w",stdout);
    scanf("%d%d",&n,&m);
    for (i=1;i<=n;i++)
        for (j=1;j<=n;j++)
            scanf("%d",&a[0][i][j]);
    for (k=1;(1<<k)<=n;k++)
        for (i=1;i+(1<<k-1)<=n;i++)
            for (j=1;j+(1<<k-1)<=n;j++)
            {
                a[k][i][j]=a[k-1][i][j+(1<<(k-1))];
                if (a[k][i][j]<a[k-1][i][j])
                    a[k][i][j]=a[k-1][i][j];
                if (a[k][i][j]<a[k-1][i+(1<<(k-1))][j])
                    a[k][i][j]=a[k-1][i+(1<<(k-1))][j];
                if (a[k][i][j]<a[k-1][i+(1<<(k-1))][j+(1<<(k-1))])
                    a[k][i][j]=a[k-1][i+(1<<(k-1))][j+(1<<(k-1))];
            }

    for (i=2;i<=n;i++)
        lg[i]=lg[i/2]+1;
    int max;
    for (i=1;i<=m;i++)
    {
        scanf("%d%d%d",&x,&y,&k);
        l=lg[k];
        max=a[l][x][y];
        if (max<a[l][x][y+k-(1<<l)])
            max=a[l][x][y+k-(1<<l)];
        if (max<a[l][x+k-(1<<l)][y+k-(1<<l)])
            max=a[l][x+k-(1<<l)][y+k-(1<<l)];
        if (max<a[l][x+k-(1<<l)][y])
            max=a[l][x+k-(1<<l)][y];
        printf("%d\n",max);
    }
    return 0;
}