Cod sursa(job #2514428)

Utilizator cyg_vladioanBirsan Vlad cyg_vladioan Data 25 decembrie 2019 19:16:43
Problema Plantatie Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.21 kb
#include <cstdio>
#include <algorithm>
using namespace std;
const int NMAX = 500;
int d[12][NMAX + 5][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[k][i][j] = max(max(d[k - 1][i][j] , d[k - 1][i][j + (1 << (k - 1))]) , max(d[k - 1][i + (1 << (k - 1))][j] , d[k - 1][i + (1 << (k - 1))][j + (1 << (k - 1))]));
}
int solve(int x , int y , int k)
{
    int j , xf , yf;
    xf = x + k - 1;
    yf = y + k - 1;
    j = 0;
    while((1 << j) <= k)
        j ++;
    j --;
    return max(max(d[j][x][y] , d[j][x][yf - (1 << k) + 1]) , max(d[j][xf - (1 << j) + 1][y] , d[j][xf - (1 << j) + 1][yf - (1 << j) + 1]));
}
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[0][i][j]);
    dinamica();
    for(i = 1 ; i <= m ; i ++)
    {
        scanf("%d%d%d" , &x , &y , &k);
        printf("%d\n" , solve(x , y , k));
    }
    return 0;
}