Cod sursa(job #349362)

Utilizator Mishu91Andrei Misarca Mishu91 Data 19 septembrie 2009 11:14:46
Problema Plantatie Scor 100
Compilator cpp Status done
Runda info.conc.sept.2 Marime 1.24 kb
#include <fstream>
#include <algorithm>

using namespace std;

#define MAX_N 505

ifstream fin ("plantatie.in");
ofstream fout ("plantatie.out");

int N, M;
int A[MAX_N][MAX_N], Rmq[10][MAX_N][MAX_N], L[MAX_N];

inline int Max(const int &A, const int &B, const int &C, const int &D)
{
    return max(max(max(A, B), C), D);
}

void citire()
{
    fin >> N >> M;

    for(int i = 1; i <= N; ++i)
        for(int j = 1; j <= N; ++j)
        {
            fin >> A[i][j];
            Rmq[0][i][j] = A[i][j];
        }
    //fout << M << "\n";
}

void solve()
{
    int a, b, k;
    fin >> a >> b >> k;

    int l = L[k];
    int sh = k - (1 << l);

    fout << Max(Rmq[l][a][b], Rmq[l][a+sh][b], Rmq[l][a][b+sh], Rmq[l][a+sh][b+sh]) << "\n";
}

void pre()
{
    for(int i = 2; i <= N; ++i)
        L[i] = L[i/2] + 1;
    for(int k = 1; (1 << k) <= N; ++k)
        for(int i = 1; i <= N - (1 << k) + 1; ++i)
            for(int j = 1; j <= N - (1 << k) + 1; ++j)
            {
                int l = 1 << (k - 1);
                Rmq[k][i][j] = Max(Rmq[k-1][i][j], Rmq[k-1][i+l][j], Rmq[k-1][i][j+l], Rmq[k-1][i+l][j+l]);
            }
}

int main()
{
    citire();
    pre();
    while(M--)
        solve();
}