Cod sursa(job #998575)

Utilizator Andrei1998Andrei Constantinescu Andrei1998 Data 17 septembrie 2013 17:48:00
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.87 kb
#include <fstream>

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-1))],din[k-1][i+(1<<(k-1))][j],din[k-1][i+(1<<(k-1))][j+(1<<(k-1))]);
                    //if(i==0 && j==0 && k==1)
                    //{
                   //     cout<<"da"<<endl;
                   //     cout<<"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)]<<endl;
                   // }
                }
                //cout<<din[k][i][j]<<' ';
           }
            //cout<<endl;
        }
    //cout<<endl<<endl;
    }
}

int main()
{
    ifstream cin("plantatie.in");
    ofstream cout("plantatie.out");

    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];
          //cout<<"INCEP\n\n\n";
    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';
    }
    cin.close();
    cout.close();


    return 0;
}