Cod sursa(job #2790999)

Utilizator teisanumihai84Mihai Teisanu teisanumihai84 Data 29 octombrie 2021 22:27:07
Problema Plantatie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.47 kb
#include <bits/stdc++.h>
using namespace std;
int n, m, i, j, p[501], d[10][501][501], maxim, l, ii, jj, x, y;
ifstream fin ("plantatie.in");
ofstream fout ("plantatie.out");
int main ()
{
    fin>>n>>m;
    for (i=1; i<=n; i++)
        for (j=1; j<=n; j++)
            fin>>d[0][i][j];
    p[1]=0; /// p[i]=cea mai mare putere de 2 mai mica sau egala cu i
    for (i=2; i<=n; i++)
        p[i]=p[i/2]+1;
    ///d[l][i][j]=val maxima din patratul de latura 2^l cu coltul din st sus in (i,j)
    for (l=1; l<=p[n]; l++)
        for (i=1; i<=n; i++)
            for (j=1; j<=n; j++)
                if (i+(1<<l)-1<=n && j+(1<<l)-1<=n)
                {
                    maxim=d[l-1][i][j];
                    ii=i+(1<<(l-1));
                    jj=j+(1<<(l-1));
                    if (maxim<d[l-1][ii][j])
                        maxim=d[l-1][ii][j];
                    if (maxim<d[l-1][ii][jj])
                        maxim=d[l-1][ii][jj];
                    if (maxim<d[l-1][i][jj])
                        maxim=d[l-1][i][jj];
                    d[l][i][j]=maxim;
                }
    for (int t=1; t<=m; t++)
    {
        fin>>i>>j>>x;
        maxim=d[p[x]][i][j];
        y=(1<<p[x]);
        if (maxim<d[p[x]][i+x-y][j])
            maxim=d[p[x]][i+x-y][j];
        if (maxim<d[p[x]][i+x-y][j+x-y])
            maxim=d[p[x]][i+x-y][j+x-y];
        if (maxim<d[p[x]][i][j+x-y])
            maxim=d[p[x]][i][j+x-y];
        fout<<maxim<<"\n";
    }
}