Cod sursa(job #1043129)

Utilizator ELHoriaHoria Cretescu ELHoria Data 28 noiembrie 2013 00:39:53
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.37 kb
#include <fstream>
#include <algorithm>
#include <vector>

using namespace std;

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

const int nmax = 502;
int lg[nmax];
int n, m;
int rmq[10][nmax][nmax];
int a[nmax][nmax];

void readData() {
    cin >> n >> m;
    for (int i = 1;i <= n;i++) {
        for (int j = 1;j <= n;j++) {
            cin >> a[i][j];
        }  
    }
}

void compute() {

    for (int i = 1;i <= n;i++) {
        for (int j = 1;j <= n;j++) {
            rmq[0][i][j] = a[i][j]; 
        }
    }

    for (int i = 2;i <= n;i++) {
        lg[i] = lg[i >> 1] + 1;
    }

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

inline int query(int i,int j,int k) {
    int l = lg[k];
    return max(max(rmq[l][i][j],rmq[l][i + k - (1 << l)][j]),
               max(rmq[l][i + k - (1 << l)][j + k - (1 << l)],rmq[l][i][j + k - (1 << l)]));
}

int main()
{
    readData();
    compute();
    for (int i = 1;i <= m;i++) {
        int x, y, z;
        cin >> x >> y >> z;
        cout << query(x,y,z) << "\n";
    }
    return 0;
}