Cod sursa(job #2789760)

Utilizator RaresPoinaruPoinaru-Rares-Aurel RaresPoinaru Data 27 octombrie 2021 22:07:10
Problema Plantatie Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.44 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin ("plantatie.in");
ofstream fout ("plantatie.out");

const int NMAX=530;
const int KMAX=33;

int rmq[NMAX][NMAX][KMAX],n,m,logaritm[NMAX];

int main()
{
    fin >>n>>m;

    int t=1;
    while ((1<<t)<513){
        logaritm[1<<t]++;
        t++;
    }
    t=1;
    while (t<513){
        logaritm[t]+=logaritm[t-1];
        //fout <<logaritm[t]<<' ';
        t++;
    }

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

    int kmax=logaritm [n];
    for (int k=1;k<=kmax;k++){
        for (int i=1;i+(1<<k)-1<=n;++i){
            for (int j=1;j+(1<<k)-1<=n;++j){
                int a,b,c,d;
                a=rmq[i][j][k-1];
                b=rmq[i][j+(1<<k-1)][k-1];
                c=rmq[i+(1<<k-1)][j][k-1];
                d=rmq[i+(1<<k-1)][j+(1<<k-1)][k-1];
                rmq[i][j][k]=max (max (a,b),max (c,d));
                //fout <<rmq[i][j][k]<<' ';
            }
            //fout <<'\n';
        }
        //fout <<'\n';
    }

    for (int r=1;r<=m;++r){
        int i,j,c,a,b,d,e;
        fin >>i>>j>>c;
        int k=logaritm [c];
        a=rmq[i][j][k];
        b=rmq[i][j+c-(1<<k)][k];
        d=rmq[i+c-(1<<k)][j][k];
        e=rmq[i+c-(1<<k)][j+c-(1<<k)][k];
        fout <<max(max (a,b),max (d,e))<<'\n';
    }
    fin.close ();
    fout.close ();
    return 0;
}