Cod sursa(job #1691905)

Utilizator catalin9898Bajenaru Catalin catalin9898 Data 19 aprilie 2016 18:54:06
Problema Plantatie Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.32 kb
#include <cstdio>

using namespace std;

int r[503][503][9],log[505];
int ma(int a,int b,int c,int d)
{
    if(a<b)a=b;
    if(c<d)c=d;
    if(a<c)return c;
    return a;
}

int main()
{freopen("plantatie.in","r",stdin);
 freopen("plantatie.out","w",stdout);
    int i,j,n,m,p,k,t,f,h,a,b;
    scanf("%d%d",&n,&m);
    for(i=1;i<=n;i++)
        for(j=1;j<=n;j++)
        scanf("%d",&(r[i][j][0]));



        log[1]=0;
        for(i=2;i<=504;i++)
            log[i]=log[i/2]+1;




        for(h=1;h<=log[n];h++)
            for(i=1<<h;i<=n;i++)
            for(j=1<<h;j<=n;j++)
        {
            k=(1<<h-1);
            r[i][j][h]=ma(r[i][j][h-1],r[i-k][j][h-1],r[i][j-k][h-1],r[i-k][j-k][h-1]);
        }


/*
        for(f=0;f<=log[n];f++)
        {
            for(i=1;i<=n;i++)
            {
                for(j=1;j<=n;j++)
                {
                    printf("%d ",r[i][j][f]);
                }printf("\n");
            }printf("\n\n\n\n\n");
        }

*/


        for(f=0;f<m;f++)
        {
            scanf("%d%d%d",&a,&b,&t);t--;
            a=a+t;b=b+t;
            if(a>b){k=log[b];}
            else k=log[a];

            p=ma(r[a][b][k],r[a-1<<k][b][k],r[a][b-1<<k][k],r[a-1<<k][b-1<<k][k]);
            printf("%d\n",p);
        }

    return 0;
}