Cod sursa(job #2048896)

Utilizator NicolaalexandraNicola Alexandra Mihaela Nicolaalexandra Data 26 octombrie 2017 17:57:32
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.19 kb
#include <fstream>
#define DIM 501
using namespace std;

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

int n,q,i,j,k,nr,x,val,l[DIM],d[DIM][DIM][11];

int main (){

    fin>>n>>q;
    for (i=1;i<=n;i++)
        for (j=1;j<=n;j++)
            fin>>d[i][j][0];
    /// facem rmq 2d                                                      k
    /// d[k][i][j]-maximul din patratul care se termina in i,j si de lungime 2
    //p[0] = 1;
    //for (i=1;p[i-1]*2<=n;i++)
      //  p[i] = p[i-1] * 2;
    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-1],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 (;q--;){
        fin>>i>>j>>k;
        val = l[k];
        x = (1<<val);
        nr = max (d[i+x-1][j+x-1][val],d[i+x-1][j+k-1][val]);
        nr = max (nr,d[i+k-1][j+x-1][val]);
        nr = max (nr,d[i+k-1][j+k-1][val]);
        fout<<nr<<"\n";
    }

    return 0;
}