Cod sursa(job #1521175)

Utilizator dorin31Geman Dorin Andrei dorin31 Data 9 noiembrie 2015 23:15:18
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.28 kb
#include <iostream>
#include <fstream>
#include <sstream>
#define maxN 501

using namespace std;

ifstream fin("plantatie.in");
ofstream fout("plantatie.out");
std::stringstream buffer;

int n,m,i,j,k;
int lg[maxN], rmq[9][501][501];

inline int maxim(int a, int b)
{
    return (a>b) ? a:b;
}

void create_lg()
{
    for (i=2; i<=n; ++i)
        lg[i]=lg[i>>1]+1;
}

int main()
{
    fin>>n>>m;
    create_lg();

    for (i=1; i<=n; ++i)
        for (j=1; j<=n; ++j)
            fin>>rmq[0][i][j];

    for (k=1; k<=lg[n]; ++k)
        for (i=1; i<=n; ++i)
            for (j=1; j<=n; ++j)
    {
        rmq[k][i][j]=rmq[k-1][i][j];
        if (i+(1<<(k-1))<=n) rmq[k][i][j]=maxim(rmq[k][i][j], rmq[k-1][i+(1<<(k-1))][j]);
        if (j+(1<<(k-1))<=n) rmq[k][i][j]=maxim(rmq[k][i][j], rmq[k-1][i][j+(1<<(k-1))]);
        if (i+(1<<(k-1))<=n) rmq[k][i][j]=maxim(rmq[k][i][j], rmq[k-1][i+(1<<(k-1))][j+(1<<(k-1))]);
    }

    while (m)
    {
        fin>>i>>j>>k;
        int line=lg[k];
        int res=rmq[line][i][j];
        res=maxim(res, rmq[line][i+k-(1<<line)][j]);
        res=maxim(res, rmq[line][i][j+k-+(1<<line)]);
        res=maxim(res, rmq[line][i+k-(1<<line)][j+k-(1<<line)]);
        fout<<res<<'\n';
        --m;
    }

    return 0;
}