Cod sursa(job #1957718)

Utilizator the.manIon Man the.man Data 7 aprilie 2017 18:50:09
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.2 kb
#include <fstream>
#include <cmath>
#include <algorithm>

using namespace std;
 ifstream fi("plantatie.in");
 ofstream fo("plantatie.out");

int maxim (int a,int b,int c, int d)
{
    return max(max(a,b),max(c,d));
}
int rmq[501][501][10];
int N,M;

void Build()
{
    int i,j,k;

    for(i = 1; i <= N; ++i) for(j = 1; j <= N; ++j) fi>>rmq[i][j][0];

    for(k = 1; (1<<k) <= N; ++k)
        for(i = 1; i <= N-(1<<k)+1; ++i)
            for(j = 1; j <= N-(1<<k)+1; ++j)
              rmq [i][j][k] = maxim(rmq[i]         [j]         [k-1] ,
                                    rmq[i+(1<<k-1)][j]         [k-1] ,
                                    rmq[i]         [j+(1<<k-1)][k-1] ,
                                    rmq[i+(1<<k-1)][j+(1<<k-1)][k-1] );

}

int Query(int i,int j,int k)
{
    int t = log2(k);
    return   maxim( rmq[i]         [j]         [t] ,
                    rmq[i+k-(1<<t)][j]         [t] ,
                    rmq[i]         [j+k-(1<<t)][t] ,
                    rmq[i+k-(1<<t)][j+k-(1<<t)][t] );

}
int main()
{

    fi>>N>>M;
    Build();

    while(M--)
    {   int i,j,k;
        fi>>i>>j>>k;
        fo<<Query(i,j,k)<<'\n';
    }


return 0;
}