Cod sursa(job #842121)

Utilizator stoicatheoFlirk Navok stoicatheo Data 26 decembrie 2012 10:57:55
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.57 kb
#include <fstream>

using namespace std;

const char InFile[]="plantatie.in";
const char OutFile[]="plantatie.out";
const int MaxN=505;
const int MaxSqrN=MaxN*MaxN;
const int LogMaxSqrN=11;

ifstream fin(InFile);
ofstream fout(OutFile);

int rmq[LogMaxSqrN][MaxN][MaxN],N,M,lg[MaxN],x,y,l;

int main()
{
    fin>>N>>M;
    for(register int i=1;i<=N;++i)
    {
        for(register int j=1;j<=N;++j)
        {
            fin>>rmq[0][i][j];
        }
    }
    for(register int i=2;i<=N;++i)
    {
        lg[i]=lg[i>>1]+1;
    }
    int p=1;
    for(register int k=1;k<LogMaxSqrN;++k,p<<=1)
    {
        for(register int i=1;i<=N;++i)
        {
            for(register int j=1;j<=N;++j)
            {
                rmq[k][i][j]=rmq[k-1][i][j];
                if(i+p<=N)
                {
                    rmq[k][i][j]=max(rmq[k][i][j],rmq[k-1][i+p][j]);
                }
                if(j+p<=N)
                {
                    rmq[k][i][j]=max(rmq[k][i][j],rmq[k-1][i][j+p]);
                }
                if(i+p<=N && j+p<=N)
                {
                    rmq[k][i][j]=max(rmq[k][i][j],rmq[k-1][i+p][j+p]);
                }
            }
        }
    }

    for(register int i=0;i<M;++i)
    {
        fin>>x>>y>>l;
        int k=(1<<lg[l]);
        int x2=x+l;
        int y2=y+l;
        int sol=max(rmq[lg[l]][x][y],rmq[lg[l]][x2-k][y]);
        sol=max(sol,rmq[lg[l]][x][y2-k]);
        sol=max(sol,rmq[lg[l]][x2-k][y2-k]);
        fout<<sol<<"\n";
    }
    fin.close();
    fout.close();
    return 0;
}