Cod sursa(job #1980581)

Utilizator NToniBoSSNicolae Tonitza NToniBoSS Data 13 mai 2017 13:56:01
Problema Plantatie Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 1.13 kb
#include <stdio.h>
#include <stdlib.h>
int r[502][502][10],log[501],tut[501][501];
int max1(int x,int y)
{
    if(x>y) return x;
    return y;
}
int max(int x,int y,int z,int t)
{
    if(max1(x,y)>max1(z,t)) return max1(x,y);
    return max1(z,t);
}
int main()
{
    int n,m,i,j,k,a,b,c;
    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",&tut[i][j]);
    for(i=2; i<=n; i++)
        log[i]=log[i/2]+1;
    for(i=1; i<=n; i++)
        for(j=1; j<=n; j++)
            r[i][j][0]=tut[i][j];
    for(k=1; k<=log[n] && k<=log[n]; k++)
        for(i=1; i<=n; i++)
            for(j=1; j<=n; j++)
                if(k<=log[n-i+1] && k<=log[n-j+1])
                    r[i][j][k]=max(r[i][j][k-1],r[i+(1<<(k-1))][j+(1<<(k-1))][k-1],r[i+(1<<(k-1))][j][k-1],r[i][j+(1<<(k-1))][k-1]);
    for(i=1; i<=m; i++)
    {
        scanf("%d%d%d",&a,&b,&c);
        j=log[c];
        printf("%d\n",max(r[a][b][j],r[a+c-(1<<j)][b][j],r[a+c-(1<<j)][b+c-(1<<j)][j],r[a][b+c-(1<<j)][j]));
    }

    return 0;
}