Cod sursa(job #1964919)

Utilizator Marius7122FMI Ciltea Marian Marius7122 Data 13 aprilie 2017 19:54:52
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.24 kb
#include <iostream>
#include <fstream>

using namespace std;

ifstream f1("plantatie.in");
ofstream f2("plantatie.out");

const int N = 505;
const int LOG = 10;

int n,q,i,j,k,x1,y1,l;
int rmq[LOG][N][N],log[N];

int max4(int a,int b,int c,int d)
{
    return max(max(a,b),max(c,d));
}

void citeste()
{
    f1>>n>>q;
    for(i=1;i<=n;i++)
        for(j=1;j<=n;j++)
            f1>>rmq[0][i][j];
}

void prep()
{
    for(i=2;i<=n;i++)
        log[i] = log[i/2] + 1;

    for(k=1;(1<<k) <= n; k++)
        for(i=1;i<=n;i++)
            for(j=1;j<=n;j++)
                rmq[k][i][j] = max4(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))]);
}

int query()
{
    int lg = log[l];
    int dif = l - (1<<lg);

    return max4(rmq[lg][x1]    [y1],
                rmq[lg][x1+dif][y1],
                rmq[lg][x1]    [y1+dif],
                rmq[lg][x1+dif][y1+dif]);
}

int main()
{
    citeste();

    prep();

    while(q--)
    {
        f1>>x1>>y1>>l;
        f2<<query()<<'\n';
    }

    return 0;
}