Cod sursa(job #1403352)

Utilizator AlexNiuclaeNiculae Alexandru Vlad AlexNiuclae Data 27 martie 2015 11:10:07
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.05 kb
#include <cstdio>
#include <algorithm>

using namespace std;

int n , m , i , j , k , x , y , l , X , Y;

int d[9][510][510];

int lg[510];

void rmq()
{
    lg[1] = 0;
    for (int i = 2; i <= n; ++i) lg[i] = lg[i >> 1] + 1;

    for (int k = 1; k <= lg[n]; ++k)
    {
        int lat = (1 << k);

        for (int i = 1; i <= n - lat / 2; ++i)
         for (int j = 1; j <= n - lat / 2; ++j)
          d[k][i][j] = max(max(d[k-1][i][j] , d[k-1][i+lat/2][j+lat/2]) , max(d[k-1][i+lat/2][j] , d[k-1][i][j+lat/2]));
    }
}

int main()
{
    freopen("plantatie.in","r",stdin);
    freopen("plantatie.out","w",stdout);

    scanf("%d %d", &n, &m);

    for (i = 1; i <= n; ++i)
     for (j= 1; j <= n; ++j)
      scanf("%d", &d[0][i][j]);

    for (rmq() , i = 1; i <= m; ++i)
    {
        scanf("%d %d %d", &x, &y, &l);

        X = x + l - 1; Y = y + l - 1; k = lg[l];

        printf("%d\n", max( max(d[k][x][y] , d[k][X-(1<<k)+1][Y-(1<<k)+1]) , max(d[k][X-(1<<k)+1][y] , d[k][x][Y-(1<<k)+1]) ) );
    }

    return 0;
}