Cod sursa(job #1806995)

Utilizator NicolaalexandraNicola Alexandra Mihaela Nicolaalexandra Data 15 noiembrie 2016 21:34:49
Problema Plantatie Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.18 kb
#include <fstream>
#define DIM 501
using namespace std;
int i,j,n,q,ii,x,y,k,val,nr;
int d[20][DIM][DIM],p[20],l[DIM];
ifstream fin ("plantatie.in");
ofstream fout ("plantatie.out");

int main (){

    fin>>n>>q;
    for (i=1;i<=n;i++){
        for (j=1;j<=n;j++)
            fin>>d[0][i][j];
    }
    //d[p][i][j] - maximul din tabloul care se termina in i j de dimensiuni 1<<p
    p[0] = 1;
    for (i=1;p[i-1]*2<=n;i++)
        p[i] = 2*p[i-1];
    l[1] = 0;
    for (i=2;i<=n;i++)
        l[i] = 1+l[i/2];
    for (ii=1;(1<<ii)<=n;ii++){// dimensiunea
        for (i=p[ii];i<=n;i++)
            for (j=p[ii];j<=n;j++){
                d[ii][i][j] = max (d[ii-1][i-p[ii-1]+1][j-p[ii-1]+1],d[ii-1][i-p[ii-1]+1][j]);
                d[ii][i][j] = max (d[ii][i][j],d[ii-1][i][j-p[ii-1]+1]);
                d[ii][i][j] = max (d[ii][i][j],d[ii-1][i][j]);
            }

    }
    for (;q>=1;q--){
        fin>>i>>j>>k;
        val = l[k];
        nr = max (d[val][i+(1<<val)-1][j+(1<<val)-1],d[val][i+(1<<val)-1][j+k-1]);
        nr = max (nr,d[val][i+k-1][j+(1<<val)-1]);
        nr = max (nr,d[val][i+k-1][j+k-1]);
        fout<<nr<<"\n";
    }

    return 0;
}