Cod sursa(job #3254556)

Utilizator Cristian_NegoitaCristian Negoita Cristian_Negoita Data 7 noiembrie 2024 20:27:19
Problema Plantatie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.2 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin("plantatie.in");
ofstream fout("plantatie.out");

const int NMAX = 505, LOG = 10;
int a[NMAX][NMAX], rmq[NMAX][NMAX][LOG];

inline int maxim(int a, int b, int c, int d)
{
    return max(max(a, b), max(c, d));
}

void build_rmq(int n)
{
    for(int i = 1; i <= n; i++)
        for(int j = 1; j <= n; j++)
            rmq[i][j][0] = a[i][j];
    for(int p = 1; p < LOG; p++)
        for(int i = 1; i + (1 << p) - 1 <= n; i++)
            for(int j = 1; j + (1 << p) - 1 <= n; j++)
                rmq[i][j][p] = maxim(rmq[i][j][p-1], rmq[i+(1<<(p-1))][j][p-1], rmq[i][j+(1<<(p-1))][p-1], rmq[i+(1<<(p-1))][j+(1<<(p-1))][p-1]);
}

int query(int i, int j, int lat)
{
    int e = 31 - __builtin_clz(lat);
    return maxim(rmq[i][j][e], rmq[i+lat-(1<<e)][j][e], rmq[i][j+lat-(1<<e)][e], rmq[i+lat-(1<<e)][j+lat-(1<<e)][e]);
}

int main()
{
    int n, m;
    fin >> n >> m;
    for(int i = 1; i <= n; i++)
        for(int j = 1; j <= n; j++)
            fin >> a[i][j];
    build_rmq(n);
    while(m--)
    {
        int i, j, lat;
        fin >> i >> j >> lat;
        fout << query(i, j, lat) << "\n";
    }

    return 0;
}