Cod sursa(job #1692321)

Utilizator pringonGoje Samuel Andrei Daniel pringon Data 20 aprilie 2016 17:55:46
Problema Plantatie Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.17 kb
#include <fstream>

using namespace std;

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

int mat[502][502][10], log[502][502], n, m, lin, col, lat;

int max(int a,int b) {
    if(a > b)
        return a;
    return b;
}

void preMat() {
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
           for(int k=1; (1<<k) <=j; k++)
            mat[i][j][k] = max(mat[i][j][k-1], mat[i][j - (1<<(k-1)) ][k-1]);
}

void preLog() {
    for(int i=1;i<=n;i++) {

        log[i][0] = 0;

        for(int j=2;j<=n;j++)
            log[i][j] = 1 + log[i][j/2];
    }
}

void read() {
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            in>>mat[i][j][0];

    preMat();
    preLog();
}

void response() {
    for(int nr=1;nr<=m;nr++) {
        in>>lin>>col>>lat;

        int biggest = 0;
        int i = lin;
        int l, current;

        for(int j=col;j<=(col+lat);j++) {
            l = log[j][j-i+1];
            current = max(mat[j][j][l], mat[i+ (1<<l) - 1][j][l]);
            biggest = max(biggest, current);
        }
        out<<biggest<<"\n";
    }
}

int main()
{
    in>>n>>m;
    read();

    response();

    in.close();
    out.close();
    return 0;
}