Cod sursa(job #1198433)

Utilizator Cristian1997Vintur Cristian Cristian1997 Data 15 iunie 2014 18:01:28
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.34 kb
using namespace std;
#include <fstream>
ifstream fin("plantatie.in");
ofstream fout("plantatie.out");

const int Nmax = 500;
const int logMax = 9;

int log[Nmax];
int RMQ[logMax][Nmax][Nmax];

void citire(int&, int&) ;
void preprocess(int) ;
inline int myMax(int, int, int, int) ;

int main()
{
    int m, n, a, b, k, lg;
    citire(n, m);
    preprocess(n);
    for(; m; --m)
    {
        fin >> a >> b >> k; --a; --b;
        lg = log[k];
        fout << myMax(RMQ[lg][a][b], RMQ[lg][a+k-(1<<lg)][b],
                        RMQ[lg][a][b+k-(1<<lg)], RMQ[lg][a+k-(1<<lg)][b+k-(1<<lg)]) << '\n';
    }
    return 0;
}


void citire(int &n, int &m)
{
    int i, j;
    fin>>n>>m;
    for(i = 0; i < n; ++i)
        for(j = 0; j < n; ++j)
            fin >> RMQ[0][i][j];
}

void preprocess(int n)
{
    int i, j, k;
    log[1] = 0;
    for(i = 2; i <= n; ++i) log[i] = 1 + log[i>>1];
    for(k = 1; k <= log[n]; ++k)
        for(i = 0; i+(1<<k) <= n; ++i)
            for(j = 0; j+(1<<k) <= n; ++j)
                RMQ[k][i][j] = myMax(RMQ[k-1][i][j], RMQ[k-1][i+(1<<(k-1))][j],
                                     RMQ[k-1][i][j+(1<<(k-1))], RMQ[k-1][i+(1<<(k-1))][j+(1<<(k-1))]);
}

inline int myMax(int a, int b, int c, int d)
{
    if(b > a) a = b;
    if(c > a) a = c;
    if(d > a) a = d;
    return a;
}