Cod sursa(job #2911979)

Utilizator Maniu_DianaManiu Maria Diana Maniu_Diana Data 6 iulie 2022 10:46:36
Problema Plantatie Scor 30
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.34 kb
#include <bits/stdc++.h>

using namespace std;

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

int n, m;
int mat[505][505], rmq[505][505][20], power[505];

void read()
{
    fin >> n >> m;
    for(int i = 1; i <= n; i ++)
        for(int j = 1; j <= n; j ++)
            fin >> mat[i][j];
    power[1] = 0;
    for(int i = 2; i <= n; i ++)
        power[i] = 1 + power[i / 2];
}

void RMQ()
{
    for(int i = 1; i <= n ; i ++)
        for(int j = 1; j <= n; j ++)
            rmq[i][j][0] = mat[i][j]; //maximul pe secv de 1/1
    for(int k = 1; k <= n; k ++)
        for(int i = 1; i <= n - (1 << (k - 1)); i ++) //ultima secv este de la n - puterea lui 2 < n
            for(int j = 1; j <= n - (1 << (k - 1)); j ++)
                rmq[i][j][k] = max( max(rmq[i][j][k - 1], rmq[i + (1 << (k - 1))][j][k - 1]), max(rmq[i][j + (1 << (k - 1))][k - 1], rmq[i + (1 << (k - 1))][j + (1 << (k - 1))][k - 1]));

}

void solve()
{
    int i, j, k, ans;
    for(int p = 1; p <= m; p ++)
    {
        fin >> i >> j >> k;
        int put = power[k];
        ans = max( max(rmq[i][j][put], rmq[i][j + k - (1 << put)][put]), max(rmq[i + k - (1 << put)][j][put], rmq[i + k - (1 << put)][j + k - (1 << put)][put]));
        fout << ans << '\n';
    }
}

int main()
{
    read();
    RMQ();
    solve();
    return 0;
}