Cod sursa(job #1700575)

Utilizator pringonGoje Samuel Andrei Daniel pringon Data 10 mai 2016 20:12:13
Problema Plantatie Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.14 kb
#include <fstream>

using namespace std;

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

int mat[502][502][10], log[502], n, m;

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) <=i; k++)
            mat[i][j][k] = max(max(mat[i][j][k-1], mat[i][j - (1<<(k-1)) ][k-1]),
                               max(mat[i - (1<<(k-1)) ][j][k-1], mat[i - (1<<(k-1)) ][j - (1<<(k-1)) ][k-1]));
}

void preLog() {
    for(int j=2;j<=n;j++)
            log[j] = 1 + log[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() {
    int i, j, lat;
    for(int nr=1;nr<=m;nr++) {
        in>>i>>j>>lat;
        i += lat -1;
        j += lat -1;

        int l = log[lat];

        out<<max(max(mat[i][j][l], mat[i][j - (1<<l)][l]),
                 max(mat[i - (1<<l)][j][l], mat[i - (1<<l)][j - (1<<l)][l]));
        out<<"\n";
    }
}

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

    response();

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