Cod sursa(job #3232334)

Utilizator danielbirsannBirsan Daniel danielbirsann Data 29 mai 2024 23:32:01
Problema Plantatie Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.94 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <cmath>

using namespace std;

const int MAXN = 500;
const int LOG = 9;

int N, M;
int grid[MAXN][MAXN];
int st[LOG][LOG][MAXN][MAXN];

void rmq() {
    for (int i = 0; i < N; ++i) {
        for (int j = 0; j < N; ++j) {
            st[0][0][i][j] = grid[i][j];
        }
    }

    for (int x = 0; (1 << x) <= N; ++x) {
        for (int y = 0; (1 << y) <= N; ++y) {
            if (x == 0 && y == 0) continue;
            for (int i = 0; i + (1 << x) - 1 < N; ++i) {
                for (int j = 0; j + (1 << y) - 1 < N; ++j) {
                    if (x == 0) {
                        st[x][y][i][j] = max(st[x][y-1][i][j], st[x][y-1][i][j + (1 << (y-1))]);
                    } else if (y == 0) {
                        st[x][y][i][j] = max(st[x-1][y][i][j], st[x-1][y][i + (1 << (x-1))][j]);
                    } else {
                        st[x][y][i][j] = max(
                                max(st[x-1][y-1][i][j], st[x-1][y-1][i + (1 << (x-1))][j]),
                                max(st[x-1][y-1][i][j + (1 << (y-1))], st[x-1][y-1][i + (1 << (x-1))][j + (1 << (y-1))])
                        );
                    }
                }
            }
        }
    }
}

int query(int i, int j, int k) {
    int x = (int)log2(k);
    int max_val = max(
            max(st[x][x][i][j], st[x][x][i + k - (1 << x)][j]),
            max(st[x][x][i][j + k - (1 << x)], st[x][x][i + k - (1 << x)][j + k - (1 << x)])
    );
    return max_val;
}

int main() {
    ifstream fin("plantatie.in");
    ofstream fout("plantatie.out");

    fin >> N >> M;

    for (int i = 0; i < N; ++i) {
        for (int j = 0; j < N; ++j) {
            fin >> grid[i][j];
        }
    }

    rmq();

    for (int q = 0; q < M; ++q) {
        int i, j, k;
        fin >> i >> j >> k;
        i--; j--;
        int result = query(i, j, k);
        fout << result << "\n";
    }

    fin.close();
    fout.close();

    return 0;
}