Cod sursa(job #2101395)

Utilizator BaldurCronos Baldur Data 7 ianuarie 2018 13:52:55
Problema Plantatie Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.51 kb
#include <iostream>
#include <fstream>
#include <cmath>
#define N 501
#define MXLG 9
using namespace std;
ifstream in("plantatie.in");
ofstream out("plantatie.out");
int n, m, a[N][N], rmq[N][N][MXLG];

int init_rmq() {
        for (int r = 0; r < n; r++) {
                for (int i = 0; i < n; i++)
                        rmq[r][i][0] = i;
                for (int j = 1; j <= log2(n); j++) {
                        for (int i = 0; i + (1 << j) - 1 < n; i++) {
                                if (a[r][rmq[r][i][j - 1]] > a[r][rmq[r][i + (1 << j - 1)][j - 1]]) {
                                        rmq[r][i][j] = rmq[r][i][j - 1];
                                } else {
                                        rmq[r][i][j] = rmq[r][i + (1 << j - 1)][j - 1];
                                }
                        }
                }
        }
}

int query(int x, int y, int k) {
        x--, y--;
        int res = 0;
        for (int i = x; i < x + k; i++) {
                int p = log2(k);
                res = max(res, max(a[i][rmq[i][y][p]], a[i][rmq[i][y + k - (1 << p)][p]]));
        }
        return res;
}

int main() {
        in >> n >> m;
        for (int i = 0; i < n; i++) {
                for (int j = 0; j < n; j++)
                        in >> a[i][j];
        }
        init_rmq();

        int a, b, c;
        for (int i = 1; i <= m; i++) {
                in >> a >> b >> c;
                out << query(a, b, c) << "\n";
        }
        return 0;
}