Cod sursa(job #998502)

Utilizator Andrei1998Andrei Constantinescu Andrei1998 Data 17 septembrie 2013 10:42:45
Problema Plantatie Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.23 kb
#include <iostream>

using namespace std;

int din[10][505][505];
int log2[505],n;
int mat[505][505];

void precalc_log()
{
    int i;
    log2[1]=0;
    for(i=2;i<=n;i++)
       log2[i]=log2[i/2]+1;
}

int maxim(int a,int b)
{
    if(a>b)
       return a;
    return b;
}

int maxim(int a,int b,int c,int d)
{
    int x=maxim(a,b);
    int y=maxim(c,d);
    if(x>y)
       return x;
    return y;
}

void precalc()
{
    int i,j,k,ln=log2[n];
    for(i=0;i<n;i++)
       for(j=0;j<n;j++)
          din[0][i][j]=mat[i][j];
    for(k=1;k<=ln;k++)
        for(i=0;i<n;i++)
           for(j=0;j<n;j++)
                if(((i+((1<<k)-1))<n) && ((j+((1<<k)-1))<n))
                    din[k][i][j]=maxim(din[k-1][i][j],din[k-1][i][j+(1<<k)],din[k-1][i+(1<<k)][j],din[k-1][i+(1<<k)][j+(1<<k)]);
}

int main()
{
    int i,j,m,a,b,l,lg;
    cin>>n>>m;
    precalc_log();
    for(i=0;i<n;i++)
       for(j=0;j<n;j++)
          cin>>mat[i][j];
    precalc();
    for(i=0;i<m;i++)
    {
        cin>>a>>b>>l;
        a--;
        b--;
        lg=log2[l];
        cout<<maxim(din[lg][a][b],din[lg][a][b+l-(1<<lg)],din[lg][a+l-(1<<lg)][b],din[lg][a+l-(1<<lg)][b+l-(1<<lg)])<<'\n';
    }


    return 0;
}