Cod sursa(job #779363)

Utilizator visanrVisan Radu visanr Data 17 august 2012 16:19:00
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.38 kb
#include <cstdio>
#include <cstdlib>
#include <cmath>
using namespace std;

#define nmax 510

int RMQ[nmax][nmax][11], AA[nmax][nmax], N, M, A, B, C, P;

int max(int a, int b, int c, int d)
{
    if(b > a) a = b;
    if(d > c) c = d;
    if(a > c) return a;
    else return c;
}

void Compute()
{
     int i, j, k;
     for(i = 1; i <= N; i++)
           for(j = 1; j <= N; j++)
                 RMQ[i][j][0] = AA[i][j];
     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++)
                 {
                       int aux = (1 << (k - 1));
                       RMQ[i][j][k] = max(RMQ[i][j][k - 1], RMQ[i + aux][j][k - 1], RMQ[i][j + aux][k - 1], RMQ[i + aux][j + aux][k - 1]);
                 }
}

void Solve()
{
     P = (int) log2(C);
     printf("%i\n", max(RMQ[A][B][P], RMQ[A][B + C - (1 << P)][P], RMQ[A + C - (1 << P)][B][P], RMQ[A + C - (1 << P)][B + C - (1 << P)][P]));
}

int main()
{
    freopen("plantatie.in", "r", stdin);
    freopen("plantatie.out", "w", stdout);
    int i, j;
    scanf("%i %i", &N, &M);
    for(i = 1; i <= N; i++)
          for(j = 1; j <= N; j++)
                scanf("%i", &AA[i][j]);
    Compute();
    for(; M; M --)
    {
          scanf("%i %i %i", &A, &B, &C);
          Solve();
    }
    scanf("%i", &i);
    return 0;
}