Cod sursa(job #21710)

Utilizator azotlichidAdrian Vladu azotlichid Data 24 februarie 2007 01:24:19
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.74 kb
#include <algorithm>
#include <iostream>
#include <iterator>
#include <list>
#include <map>
#include <queue>
#include <set>
#include <sstream>
#include <string>
#include <vector>
#include <cassert>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cctype>
#include <cstring>
using namespace std;

#define ALL(x) (x).begin(), (x).end()
#define CLEAR(X) (memset(X, 0, sizeof(X)))
#define FORI(it, x) for (__typeof((x).begin()) it = (x).begin(); it != (x).end(); ++it)
#define FOR(i, N, M) for (int i = (int)(N); i <= (int)(M); ++i)
#define REP(i, N) for (int i = 0; i < (int)(N); ++i)
#define SIZE(X) (int)((X).size())
#define TIPA(a, i) (cerr << #a << "[" #i " = " << (i) << "] = " << (a)[i] << endl)
#define TIP(x) (cerr << #x << " = " << (x) << endl)

#define MP make_pair
#define PB push_back
#define INF 0x3f3f3f3f

typedef long long LL;

#define NMAX 512
#define LGMAX 10

int N, M;
int a[LGMAX][NMAX][NMAX];

int main(void)
{
	freopen("plantatie.in", "r", stdin);
    freopen("plantatie.out", "w", stdout);
    scanf("%d %d", &N, &M);
    REP(i, N) REP(j, N) scanf("%d", &a[0][i][j]);
    for (int stp = 1, l = 1; 2 * l <= N; stp ++, l <<= 1)
    {
        REP(i, N - 2*l + 1) REP(j, N - 2*l + 1)
        a[stp][i][j] = max(max(a[stp-1][i][j], a[stp-1][i+l][j]),
                           max(a[stp-1][i][j+l], a[stp-1][i+l][j+l]));
    }
    
    REP(q, M)
    {
        int i, j, k, p;
        scanf("%d %d %d", &i, &j, &k), -- i, -- j;
        for (p = 1; (1 << p) <= k; p ++);
        -- p;
        int Ans = max(max(a[p][i][j], a[p][i][j + k - (1<<p)]),
                      max(a[p][i + k - (1<<p)][j], a[p][i + k - (1<<p)][j + k - (1<<p)]));
        printf("%d\n", Ans);
    }
    return 0;
}