Cod sursa(job #3171488)

Utilizator Nasa1004Ema Nicole Gheorghe Nasa1004 Data 18 noiembrie 2023 22:48:49
Problema Plantatie Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.78 kb
#include <fstream>

using namespace std;
const int NMAX = 502;

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

int rmq[12][12][NMAX][NMAX];
int n;
void init()
{
    for(int sizi = 0; (1 << sizi) <= n; sizi++)
    {
        for(int sizj = 0; (1 << sizj) <= n; sizj++)
        {
            if(sizi == 0 && sizj == 0)
                continue;
            for(int i = 0; i + (1 << sizi) <= n; i++)
            {
                for(int j = 0; j + (1 << sizj) <= n; j++)
                {
                    int max1 = max(rmq[max(sizi - 1, 0)][max(sizj - 1, 0)][i][j],
                                   rmq[max(sizi - 1, 0)][max(sizj - 1, 0)][i + (1 << (max((sizi - 1), 0)))][j]);
                    int max2 = max(rmq[max(sizi - 1, 0)][max(sizj - 1, 0)][i][j + (1 << max((sizj - 1), 0))],
                                   rmq[max(sizi - 1, 0)][max(sizj - 1, 0)][i + (1 << max((sizi - 1), 0))][j + (1 << max((sizj - 1), 0))]);
                    rmq[sizi][sizj][i][j] = max(max1, max2);
                }
            }
        }
    }
}
int query(int i1, int j1, int i2, int j2)
{
    int sizi = 31 - __builtin_clz(i2 - i1);
    int sizj = 31 - __builtin_clz(j2 - j1);

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

    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][0][i][j];
    }
    init();
    while(m--)
    {
        cin >> x >> y >> k;
        cout << query(x, y, x + k - 1, y + k - 1) << '\n';
    }
    return 0;
}