Cod sursa(job #3301729)

Utilizator Octa-pe-infoNechifor Octavian Octa-pe-info Data 29 iunie 2025 13:23:36
Problema Plantatie Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.51 kb
#include <iostream>
#include <bits/stdc++.h>
using namespace std;

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

int rmq[9][9][501][501];
int A[501][501];

int main() {

    int n,q;
    fin>>n>>q;

    for(int i=0; i<n; i++)
        for(int j=0; j<n; j++)
            fin>>A[i][j];

    for (int i = 0; i < n; i++)
        for (int j = 0; j < n; j++)
            rmq[0][0][i][j] = A[i][j];

    for (int ky = 1; ky < 9; ky++) {

        for (int i = 0; i < n; i++) {

            for (int j = 0; j + (1<<ky) <= n; j++) {

                rmq[0][ky][i][j] = max(rmq[0][ky-1][i][j], rmq[0][ky-1][i][j + (1<<(ky-1))]);
            }
        }
    }

    for (int kx = 1; kx < 9; kx++) {

        for (int ky = 0; ky < 9; ky++) {

            for (int i = 0; i + (1<<kx) <= n; i++) {

                for (int j = 0; j + (1<<ky) <= n; j++) {

                    rmq[kx][ky][i][j] = max(rmq[kx-1][ky][i][j],rmq[kx-1][ky][i + (1<<(kx-1))][j]);
                }
            }
        }
    }

    int lg[502];
    lg[1] = 0;

    for(int i = 2; i <= n; i++)
        lg[i] = lg[i/2] + 1;

    while(q--) {

        int x1,y1,ll;
        fin>>x1>>y1>>ll;

        x1--;
        y1--;

        int k = lg[ll];

        int x2 = x1 + ll - (1<<k);
        int y2 = y1 + ll - (1<<k);

        int m1 = max(rmq[k][k][x1][y1], rmq[k][k][x1][y2]);
        int m2 = max(rmq[k][k][x2][y1], rmq[k][k][x2][y2]);

        fout << max(m1, m2) << "\n";
    }

    return 0;
}