Cod sursa(job #3171608)

Utilizator Nasa1004Ema Nicole Gheorghe Nasa1004 Data 19 noiembrie 2023 09:28:35
Problema Plantatie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.73 kb
#include <fstream>

using namespace std;
const int NMAX = 502;
const int LMAX = 12;

ifstream cin("plantatie.in");
ofstream cout("plantatie.out");

int rmq[LMAX][NMAX][NMAX];
int n;
void init()
{
    for(int siz = 1; (1 << siz) <= n; siz++)
    {
        for(int i = 0; i + (1 << siz) - 1 <= n; i++)
        {
            for(int j = 0; j + (1 << siz) - 1 <= n; j++)
            {
                int max1 = max(rmq[siz - 1][i][j],
                               rmq[siz - 1][i + (1 << (siz - 1))][j]);
                int max2 = max(rmq[siz - 1][i][j + (1 << (siz - 1))],
                               rmq[siz - 1][i + (1 << ( siz - 1))][j + (1 << (siz - 1))]);
                rmq[siz][i][j] = max(max1, max2);

                /*rmaxq[i][j][k] = maxim(rmaxq[i][j][k - 1],
                                       maxim(rmaxq[i + (1 << (k - 1))][j][k - 1],
                                             maxim(rmaxq[i][j + (1 << (k - 1))][k - 1],
                                                   rmaxq[i + (1 << (k - 1))][j + (1 << (k - 1))][k - 1])));*/
            }
        }
    }
}
int query(int i1, int j1, int i2, int j2)
{
    int siz = 31 - __builtin_clz(i2 - i1);

    int max1 = max(rmq[siz][i1][j1], rmq[siz][i2 + 1 - (1 << siz)][j1]);
    int max2 = max(rmq[siz][i1][j2 + 1 - (1 << siz)],
                   rmq[siz][i2 + 1 - (1 << siz)][j2 + 1 - (1 << siz)]);

    return max(max1, max2);
}
int main()
{
    int m, x, y, k;
    cin >> n >> m;
    for(int i = 1; i <= n; i++)
    {
        for(int j = 1; j <= n; j++)
            cin >> rmq[0][i][j];
    }
    init();
    while(m--)
    {
        cin >> x >> y >> k;
        cout << query(x, y, x + k - 1, y + k - 1) << '\n';
    }
    return 0;
}