Cod sursa(job #3293022)

Utilizator nicoleta_iancuIancu Nicoleta nicoleta_iancu Data 10 aprilie 2025 09:05:49
Problema Plantatie Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.81 kb

#include <iostream>
#include <vector>
#include <fstream>
using namespace std;
ifstream fin("plantatie.in");
ofstream fout("plantatie.out");
vector <int> log_2;
vector <vector<vector <int>>> rmq;

void constructie_log2(int n)
{
    log_2.resize(n + 1);
    log_2[1] = 0;
    for (int i = 2; i <= n; i++)
    {
        log_2[i] = 1 + log_2[i / 2];
    }
}

int maxim(int lin, int col, int lat)
{
    int exp = log_2[lat];
    int p = (1 << exp);
    return (max(max(rmq[exp][lin - lat + p][col - lat + p], rmq[exp][lin - lat + p][col]),
        max(rmq[exp][lin][col - lat + p], rmq[exp][lin][col])));
}
int main()
{
    int n, q;
    fin >> n >> q;
    constructie_log2(n);
    rmq.resize(log_2[n] + 2);
    rmq[0].resize(n + 2);
    for (int i = 0; i <= log_2[n]; ++i) {
        rmq[i].resize(n + 1);
    }
    for (int i = 1; i <= n; ++i) {
        rmq[0][i].resize(n + 1);
        for (int j = 1; j <= n; j++) {
            fin >> rmq[0][i][j];
            cout << rmq[0][i][j] << " ";
        }
    }

    int exp = 1;
    int p = 2;
    cout << log_2[n] << endl;

    for (int exp = 1; exp <= log_2[n]; exp++)
    {
    //    rmq[exp].resize(n + 1);
        //int p = (1 << (i - 1));
        for (int l = (1 << exp); l <= n; ++l) {
            rmq[exp][l].resize(n + 1);
            for (int c = (1 << exp); c <= n; ++c) {
                p = (1 << (exp - 1));
                rmq[exp][l][c] = max(max(rmq[exp - 1][l - p][c - p], rmq[exp - 1][l - p][c]), max(rmq[exp - 1][l][c - p], rmq[exp - 1][l][c]));
                //  p *= 2;
            }
        }
    }

    for (int i = 0; i < q; i++)
    {
        int l1, l2, c1, c2, k;
        fin >> l1 >> c1 >> k;
        cout << l1 << " " << c1 << " " << k << endl;
        fout << maxim(l1, c1,k) << "\n";
    }
    return 0;
}