Cod sursa(job #3346059)

Utilizator Gabriel_DaescuDaescu Gabriel Florin Gabriel_Daescu Data 12 martie 2026 11:44:54
Problema Plantatie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.46 kb
#include <fstream>
#define NMAX 502
#define LOG 9
using namespace std;
ifstream  fin("plantatie.in");
ofstream fout("plantatie.out");
int N,M,A[NMAX][NMAX];
int rmq[LOG][NMAX][NMAX];

void citire()
{
    fin>>N>>M;

    for(int i=1; i<=N; i++)
    {
        for(int j=1; j<=N; j++)
        {
            fin>>A[i][j];
            rmq[0][i][j]=A[i][j];
        }
    }
}

int maxim(int a, int b, int c, int d)
{
    return max(a,max(b,max(c,d)));
}


int query(int x1, int y1, int k)
{
    int p=31-__builtin_clz(k);
    int len=(1<<p);

    int x2=x1+k-len;
    int y2=y1+k-len;

    return maxim(
               rmq[p][x1][y1],
               rmq[p][x2][y1],
               rmq[p][x1][y2],
               rmq[p][x2][y2]
           );
}

int main()
{
    citire();

    for(int p=1; (1<<p)<=N; p++)
    {
        int len=(1<<p);
        int half=(1<<(p-1));

        for(int i=1; i+len-1<=N; i++)
        {
            for(int j=1; j+len-1<=N; j++)
            {
                rmq[p][i][j]=maxim(
                                 rmq[p-1][i][j],
                                 rmq[p-1][i+half][j],
                                 rmq[p-1][i][j+half],
                                 rmq[p-1][i+half][j+half]
                             );
            }
        }
    }

    int x1,y1,k;
    for(int q=1; q<=M; q++)
    {
        fin>>x1>>y1>>k;
        fout<< query(x1,y1,k) << "\n";
    }

    return 0;
}