Cod sursa(job #2723035)

Utilizator DavidTosaDavid Tosa DavidTosa Data 13 martie 2021 14:55:32
Problema Plantatie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.37 kb
#include <fstream>
using namespace std;

ifstream fin("plantatie.in");
ofstream fout("plantatie.out");

int l[505], v[505][505], m[20][505][505], lg[505];

void rmq(int n)
{
    int i, j, l, a, b, c, d;
    lg[1]=0;
    for(i=2; i<=n; i++)
        lg[i]=lg[i>>1]+1;

    for(i=1; i<=n; i++)
    {
        for(j=1; j<=n; j++)
            m[0][i][j]=v[i][j];
    }

    for (l=1;l<=lg[n];l++)
    {
        for (i=1;i<=n-(1<<l)+1;i++)
        {
            for (j=1;j<=n-(1<<l)+1;j++)
            {
                a=m[l-1][i][j];
                b=m[l-1][i+(1<<(l-1))][j];
                c=m[l-1][i][j+(1<<(l-1))];
                d=m[l-1][i+(1<<(l-1))][j+(1<<(l-1))];

                m[l][i][j]=max(a,max(b,max(c,d)));
            }

        }
    }
}

int answer(int x, int y, int k)
{
    int a, b, c, d;
    a=m[lg[k]][x][y];
    b=m[lg[k]][x-(1<<(lg[k]))+k][y];
    c=m[lg[k]][x][y-(1<<(lg[k]))+k];
    d=m[lg[k]][x-(1<<(lg[k]))+k][y-(1<<(lg[k]))+k];

    return max(a, max(b, max(c, d)));
}

int main()
{
    int n, m, i, j, x, y, k;
    fin>>n>>m;
    for(i=1; i<=n; i++)
    {
        for(j=1; j<=n; j++)
            fin>>v[i][j];
    }

    rmq(n);
    for(i=1; i<=m; i++)
    {
        fin>>x>>y>>k; /// linia, coloana, latura
        fout<<answer(x, y, k)<<'\n';
    }

    return 0;
    fin.close();
    fout.close();
}