Cod sursa(job #3031198)

Utilizator MihaiZ777MihaiZ MihaiZ777 Data 18 martie 2023 23:00:25
Problema Plantatie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.76 kb
#include <fstream>
#include <iostream>
#include <math.h>
using namespace std;

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

const int MAX_N = 505;

int n, m;
int rmq[10][MAX_N][MAX_N];
int bin[MAX_N];


void BuildExp() {
    bin[1] = 0;
    for (int i = 2; i <= n; i++) {
        bin[i] = bin[i / 2] + 1;
    }
}

void BuildRMQ() {
    for (int e = 1; e < 10; e++) {
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= n; j++) {
                int lf = i + (1 << (e - 1));
                int rg = j + (1 << (e - 1));

                rmq[e][i][j] = rmq[e - 1][i][j];
                if (lf <= n) {
                    rmq[e][i][j] = max(rmq[e][i][j], rmq[e - 1][lf][j]);
                }
                if (rg <= n) {
                    rmq[e][i][j] = max(rmq[e][i][j], rmq[e - 1][i][rg]);
                }
                if (lf <= n && rg <= n) {
                    rmq[e][i][j] = max(rmq[e][i][j], rmq[e - 1][lf][rg]);
                }
            }
        }
    }
}

int QueryRMQ(int lf, int rg, int l) {
    int len = bin[l];
    int newLf = lf + l - (1 << len);
    int newRg = rg + l - (1 << len);

    int answer = max(rmq[len][lf][rg], rmq[len][newLf][newRg]);
    answer = max(answer, rmq[len][newLf][rg]);
    answer = max(answer, rmq[len][lf][newRg]);
    return answer;
}

void BuildAnswer() {
    for (int i = 1; i <= m; i++) {
        int lf, rg, len;
        fin >> lf >> rg >> len;
        fout << QueryRMQ(lf, rg, len) << '\n';
    }
}

int main() {
    fin >> n >> m;

    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= n; j++) {
            fin >> rmq[0][i][j];
        }
    }
    BuildExp();
    BuildRMQ();
    BuildAnswer();

    return 0;
}