Cod sursa(job #2514437)

Utilizator cyg_vladioanBirsan Vlad cyg_vladioan Data 25 decembrie 2019 19:25:54
Problema Plantatie Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.31 kb
#include <cstdio>
#include <algorithm>
using namespace std;
const int NMAX = 500;
int d[NMAX + 5][NMAX + 5][12] , log[NMAX + 5] , n;
void dinamica()
{
    int i , j , k;
    for(k = 1 ; (1 << k) <= n ; k ++)
        for(i = 1 ; i + (1 << k) - 1 <= n ; i ++)
            for(j = 1 ; j + (1 << k) - 1 <= n ; j ++)
                d[i][j][k] = max(max(d[i][j][k - 1] , d[i][j + (1 << (k - 1))][k - 1]) , max(d[i + (1 << (k - 1))][j][k - 1] , d[i + (1 << (k - 1))][j + (1 << (k - 1))][k - 1]));
}
int solve(int x , int y , int k)
{
    int j , xf , yf;
    xf = x + k - 1;
    yf = y + k - 1;
    j = log[k];
    return max(max(d[x][y][j] , d[x][yf - (1 << k) + 1][j]) , max(d[xf - (1 << j) + 1][y][j] , d[xf - (1 << j) + 1][yf - (1 << j) + 1][j]));
}
int main()
{
    freopen("plantatie.in" , "r" , stdin);
    freopen("plantatie.out" , "w" , stdout);
    int m , k , i , j , x , y;
    scanf("%d%d" , &n , &m);
    for(i = 1 ; i <= n ; i ++)
        for(j = 1 ; j <= n ; j ++)
            scanf("%d" , &d[i][j][0]);
    dinamica();
    for(i = 2 ; i <= n ; i = i * 2)
        log[i] = 1;
    for(i = 1 ; i <= n ; i ++)
        log[i] = log[i] + log[i - 1];
    for(i = 1 ; i <= m ; i ++)
    {
        scanf("%d%d%d" , &x , &y , &k);
        printf("%d\n" , solve(x , y , k));
    }
    return 0;
}