Cod sursa(job #3149064)

Utilizator CelestinNegraru Celestin Celestin Data 6 septembrie 2023 01:33:27
Problema Plantatie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.26 kb
#include <iostream>
#include <fstream>
#define nmax 502
#define logsize 8
using namespace std;
int rmq[nmax][nmax][logsize];///rmq[i][j][k]=elementul maxim din patratul (i,j)->(i+2^k-1,j+2^k-1)
int n,q,lg[nmax];
ifstream f("plantatie.in");
ofstream g("plantatie.out");
void compute_log()
{
    lg[1]=0;
    for(int i=2;i<=n;i++)
        lg[i]=lg[i>>1]+1;
}
int compute_max(int a,int b,int c,int d)
{
    int max1=max(a,b);
    int max2=max(c,d);
    return max(max1,max2);
}
void compute_rmq()
{
    compute_log();
    for(int k=1;k<=lg[n];k++)
    {
        for(int i=1;i+(1<<k)-1<=n;i++)
        {
            for(int j=1;j+(1<<k)-1<=n;j++)
            {
                rmq[i][j][k]=compute_max(rmq[i][j][k-1],rmq[i][j+(1<<(k-1))][k-1],rmq[i+(1<<(k-1))][j][k-1],rmq[i+(1<<(k-1))][j+(1<<(k-1))][k-1]);
            }
        }
    }
}
int main()
{

    f>>n>>q;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
        {
            f>>rmq[i][j][0];
        }
    }
    compute_rmq();
    for(int i=1;i<=q;i++)
    {
        int l,c,k,l2,c2;
        f>>l>>c>>k;
        l2=l+k-1;
        c2=c+k-1;
        g<<compute_max(rmq[l][c][lg[k]],rmq[l2-(1<<lg[k])+1][c][lg[k]],rmq[l][c2-(1<<lg[k])+1][lg[k]],rmq[l2-(1<<lg[k])+1][c2-(1<<lg[k])+1][lg[k]])<<'\n';
    }
    return 0;
}