Cod sursa(job #2049150)

Utilizator LeVladzCiuperceanu Vlad LeVladz Data 26 octombrie 2017 21:38:46
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.13 kb
#include <fstream>

using namespace std;

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

int n,m,i,j,d[501][501][11],l[501],x,k,nr;

int main()
{
    fin >> n >> m;
    for (i=1; i<=n; i++)
        for (j=1; j<=n; j++)
            fin >> d[i][j][0];
    ///rmq 2D
    ///d[i][j][k] = maximul din patratul care se termina in i j si
    ///cu lungimea 2 la k
    for (i=2; i<=n; i++)
        l[i] = l[i/2]+1;
    for (k=1; (1<<k)<=n; k++)
    {
        x = (1<<(k-1));
        for (i=(1<<k); i<=n; i++)
            for (j=(1<<k); j<=n; j++)
            {
                d[i][j][k] = max(d[i][j][k], d[i][j][k-1]);
                d[i][j][k] = max(d[i][j][k], d[i][j-x][k-1]);
                d[i][j][k] = max(d[i][j][k], d[i-x][j][k-1]);
                d[i][j][k] = max(d[i][j][k], d[i-x][j-x][k-1]);
            }
    }
    for (;m--;)
    {
        fin >> i >> j >> k;
        x = (1<<l[k]);
        nr = max(d[i+x-1][j+x-1][l[k]], d[i+x-1][j+k-1][l[k]]);
        nr = max(nr, d[i+k-1][j+x-1][l[k]]);
        nr = max(nr, d[i+k-1][j+k-1][l[k]]);
        fout << nr << "\n";
    }
    return 0;
}