Cod sursa(job #3291352)

Utilizator Lex._.Lexi Guiman Lex._. Data 4 aprilie 2025 13:13:14
Problema Plantatie Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.56 kb
#include <bits/stdc++.h>
using namespace std;

int n, m; //dimensiunile plantatiei si numarul de intrebari
int rmq[18][500][500]; //rmq 2D
int lg[501]; //logaritmul in baza 2 al fiecarui numar de la 0 la n

void precalculare() //precalculeaza rmq si logaritmul
{
    for(int i=1; i<=n; i++) //precalculam logaritmul
        lg[i]=lg[i/2]+1;

    for(int e=1; (1<<e)<n; e++) //precalculam rmq-ul
    {
        int putere=(1<<(e-1)); //puterea lui 2 de pe acel nivel
        for(int i=0; i<n-putere; i++)
        {
            for(int j=0; j<n-putere; j++)
            {
                rmq[e][i][j]=max(max(rmq[e-1][i][j], rmq[e-1][i+putere][j]), max(rmq[e-1][i][j+putere], rmq[e-1][i+putere][j+putere])); //maximul pe submatricea cu coltul stanga-sus (i, j) si latura de lungime putere
            }
        }
    }
}

int main()
{
    ifstream cin("plantatie.in");
    ofstream cout("plantatie.out");
    cin >> n >> m;
    for(int i=0; i<n; i++)
    {
        for(int j=0; j<n; j++) //citim numerele din matrice
            cin >> rmq[0][i][j];
    }
    precalculare();
    while(m--) //citim cele m intrebari
    {
        int i, j, k; //coltul stanga-sus si lungimea laturii
        cin >> i >> j >> k;
        int exponent=lg[k]; //logaritmul din baza 2 a lui k
        int maxim=max(max(rmq[exponent][i][j], rmq[exponent][i+k-(1<<exponent)][j]), max(rmq[exponent][i][j+k-(1<<exponent)], rmq[exponent][i+k-(1<<exponent)][j+k-(1<<exponent)])); //maximul din submatricea data
        cout << maxim << "\n"; //afisam maximul
    }

    return 0;
}