Cod sursa(job #1210076)

Utilizator acomAndrei Comaneci acom Data 19 iulie 2014 09:40:34
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.17 kb
#include<cstdio>
#include<algorithm>
using namespace std;
int n,m,x,y,k,Max,P[505],D[12][505][505];
int main()
{
    int i,j,l,ii,jj;
    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",&D[0][i][j]);
    for (i=2;i<=n;++i)
        P[i]=1+P[i>>1];
    for (l=1;l<=P[n];++l)
        for (i=1;i<=n;++i)
            for (j=1;j<=n;++j)
            {
                D[l][i][j]=D[l-1][i][j];
                ii=i+(1<<(l-1)), jj=j+(1<<(l-1));
                if (ii<=n)
                {
                    if (jj<=n)
                        D[l][i][j]=max(D[l][i][j],D[l-1][ii][jj]);
                    D[l][i][j]=max(D[l][i][j],D[l-1][ii][j]);
                }
                if (jj<=n)
                    D[l][i][j]=max(D[l][i][j],D[l-1][i][jj]);
            }
    for (i=1;i<=m;++i)
    {
        scanf("%d%d%d",&x,&y,&k);
        l=1<<P[k];
        Max=max(D[P[k]][x][y],D[P[k]][x+k-l][y]);
        Max=max(Max,D[P[k]][x][y+k-l]);
        Max=max(Max,D[P[k]][x+k-l][y+k-l]);
        printf("%d\n",Max);
    }
    return 0;
}