Cod sursa(job #1249815)

Utilizator ThomasFMI Suditu Thomas Thomas Data 27 octombrie 2014 15:35:27
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.12 kb
#include <fstream>
#include <algorithm>
using namespace std;

#define NMax 505
#define LGMax 10

ifstream f("plantatie.in");
ofstream g("plantatie.out");

int n,m,lgn;
int RMQ[NMax][NMax][LGMax];

void build()
{
    int x;
    for(int aux=1;aux<=n;aux<<=1) lgn++;

    for(int k=1;k<=lgn;++k) for(int i=1;i<=n;++i) for(int j=1;j<=n;++j)
    {
        x=(1<<(k-1));

        if(i+x>n && j+x>n) RMQ[i][j][k]=RMQ[i][j][k-1];
        else if(i+x>n) RMQ[i][j][k]=max( RMQ[i][j][k-1] , RMQ[i][j+x][k-1] );
        else if(j+x>n) RMQ[i][j][k]=max( RMQ[i][j][k-1] , RMQ[i+x][j][k-1] );
        else RMQ[i][j][k]=max( max ( RMQ[i][j][k-1] , RMQ[i+x][j+x][k-1] ) , max ( RMQ[i+x][j][k-1] , RMQ[i][j+x][k-1] ) );
    }
}

int main()
{
    int i,j,a,b,c,aux,p,x;

    f>>n>>m;
    for(i=1;i<=n;++i) for(j=1;j<=n;++j) f>>RMQ[i][j][0];

    build();

    while(m--)
    {
        f>>a>>b>>c;
        for(p=-1,aux=1;aux<=c;aux<<=1) p++;
        x=c-(1<<p);
        g<<max( max( RMQ[a][b][p] , RMQ[a+x][b+x][p] ) , max( RMQ[a+x][b][p] , RMQ[a][b+x][p]) )<<"\n";
    }

    f.close();
    g.close();
    return 0;
}