Cod sursa(job #999096)

Utilizator thewildnathNathan Wildenberg thewildnath Data 19 septembrie 2013 10:37:52
Problema Plantatie Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.16 kb
#include<stdio.h>

int v[502][502],d[502][502][10],Log[]={0,0,1,1,2,2,2,2,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8};

inline int max(int a,int b)
{
    return a>=b?a:b;
}

int main()
{
    freopen("plantatie.in","r",stdin);
    freopen("plantatie.out","w",stdout);
    int n,m,i,j,sol,l,k,lat;
    scanf("%d%d",&n,&m);
    ///////////////
    for(l=1;l<=n;++l)
        for(i=1;i<=n;++i)
            scanf("%d",&v[l][i]);
    for(l=1;l<=n;++l)
    {
        for(i=1;i<=n;++i)
            d[l][i][0]=i;
        for(j=1;1<<j<=n;++j)
        {
            for(i=1;i+(1<<j)-1<=n;++i)
            {
                if(v[l][d[l][i][j-1]]>=v[l][d[l][i+(1<<(j-1))][j-1]])
                    d[l][i][j]=d[l][i][j-1];
                else
                    d[l][i][j]=d[l][i+(1<<(j-1))][j-1];
            }
        }
    }
    ///////////////
    while(m--)
    {
        scanf("%d%d%d",&i,&j,&lat);
        k=Log[lat];
        sol=0;
        for(l=i;l<i+lat;++l)
        {

            if(v[d[l][j][k]]>=v[d[l][j+lat-1-(1<<k)+1][k]])
                sol=max(sol,v[l][d[l][j][k]]);
            else
                sol=max(sol,v[l][d[l][j+lat-1-(1<<k)+1][k]]);
        }
        printf("%d\n",sol);
    }
    return 0;
}