Cod sursa(job #2101423)

Utilizator BaldurCronos Baldur Data 7 ianuarie 2018 14:42:03
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.32 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream in ("plantatie.in");
ofstream out("plantatie.out");
int n, m, l[501], r[501][501][10], t, p, rez;

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

int query(int a, int b, int c) {
        int p = l[c];
        return max(r[a][b][p],
              max(r[a][b + c - (1 << p)][p],
              max(r[a + c - (1 << p)][b][p], r[a + c - (1 << p)][b + c - (1 << p)][p])));
}

int main() {
        in >> n >> m;
        l[1] = 0;
        for (int i = 2; i <= n; i++)
                l[i] = l[i / 2] + 1;

        for (int i = 1; i <= n; i++) {
                for (int j = 1; j <= n; j++) {
                        in >> r[i][j][0];
                }
        }

        init_rmq();

        int x, y, z;
        for (int i = 1; i <= m; i++) {
                in >> x >> y >> z;
                out << query(x, y, z) << "\n";
        }
        return 0;
}