Cod sursa(job #1960757)

Utilizator Lungu007Lungu Ionut Lungu007 Data 10 aprilie 2017 17:30:20
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.45 kb
#include <iostream>
#include <fstream>
#define NMAX 505
#define LOG 12

using namespace std;

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

int d[LOG][NMAX][NMAX], a[NMAX][NMAX],logn,n,m;

int log(int n)
{
    int i;
    for(i=0;(1<<i)<=n;i++);
    return i;
}

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

void rmq()
{
    logn = log(n);

    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
        {
            d[0][i][j] = a[i][j];
        }
    }
    for(int i=1;i<=logn;i++)
    {
        for(int x=1;x<=n-(1<<i)+1;x++)
        {
            for(int y=1;y<=n-(1<<i)+1;y++)
            {
                d[i][x][y] = maxim(
                                      d[i-1][x][y],d[i-1][x+(1<<(i-1))][y+(1<<(i-1))],
                                      d[i-1][x+(1<<(i-1))][y],d[i-1][x][y+(1<<(i-1))]);
            }
        }

    }
}

int rez(int x,int y, int k)
{
    int lgk = log(k)-1;
    return maxim(
                 d[lgk][x][y], d[lgk][x+k-(1<<lgk)][y+k-(1<<lgk)],
                 d[lgk][x+k-(1<<lgk)][y], d[lgk][x][y+k-(1<<lgk)]
                 );
}

int main()
{
    in >> n >> m;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
        {
            in >> a[i][j];
        }
    }

    rmq();
    int a,b,k;
    for(int i=0;i<m;i++)
    {
        in >> a >> b >> k;
        out << rez(a,b,k)  << "\n";
    }
    return 0;
}