Cod sursa(job #3301731)

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

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

int rmq[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]);
                }
            }
        }
    }
    */

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

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

        int ll = 1<<(k-1);

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

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


                int a = rmq[k-1][i][j];
                int b = rmq[k-1][i+ll][j];
                int c = rmq[k-1][i][j+ll];
                int d = rmq[k-1][i+ll][j+ll];
                rmq[k][i][j] = max( max(a,b), max(c,d) );
            }
        }
    }


    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";
    }
    */

    while(q--) {

        int x1,y1,l;
        fin>>x1>>y1>>l;

        x1--;
        y1--;

        int k = lg[l];

        int ll = l - (1<<k);

        int i0 = x1, j0 = y1;

        int i1 = x1 + ll, j1 = y1 + ll;

        int m1 = max(rmq[k][i0][j0], rmq[k][i0][j1]);
        int m2 = max(rmq[k][i1][j0], rmq[k][i1][j1]);

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

    return 0;
}