Cod sursa(job #2790201)

Utilizator LukyenDracea Lucian Lukyen Data 28 octombrie 2021 16:34:35
Problema Plantatie Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.54 kb
#include <bits/stdc++.h>

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

int latura, nr_query;
// int teren[500][500], tabel[500][500][9];
int teren[10][10], tabel[10][10][4];
int i, j, k;

void gen_tabele();
int rasp_query(int x, int y, int lat);

int main()
{
    fin >> latura >> nr_query;
    for (i = 0; i < latura; i++)
        for (j = 0; j < latura; j++)
            fin >> teren[i][j], tabel[i][j][0] = j;

    gen_tabele();
    int x, y, lat;
    for (k = 0; k < nr_query; k++)
    {
        fin >> x >> y >> lat;
        fout << rasp_query(x - 1, y - 1, lat) << "\n";
    }

    return 0;
}

void gen_tabele()
{
    int linie;
    for (linie = 0; linie < latura; linie++)
        for (j = 1; (1 << j) <= latura; j++)
            for (i = 0; i + (1 << j) - 1 < latura; i++)
                tabel[linie][i][j] = teren[linie][tabel[linie][i][j - 1]] > teren[linie][tabel[linie][i + (1 << j - 1)][j - 1]]
                                         ? tabel[linie][i][j - 1]
                                         : tabel[linie][i + (1 << j - 1)][j - 1];
    return;
}

int rasp_query(int x, int y, int lat)
{

    int put = log2(lat);
    int dif = lat - (1 << put);
    int max, maxl;
    max = maxl = teren[x][y];

    for (i = x; i < lat + x; i++)
    {
        maxl = teren[i][tabel[i][y][put]] > teren[i][tabel[i][y + dif][put]] ? teren[i][tabel[i][y][put]] : teren[i][tabel[i][y + dif][put]];
        if (maxl > max)
            max = maxl;
    }
    return max;
}