Cod sursa(job #1772243)

Utilizator TimitocArdelean Andrei Timotei Timitoc Data 6 octombrie 2016 16:39:54
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.53 kb
#include <iostream>
#include <cstdio>
#define MAXN 512
#define MAXLOG 10

using namespace std;

int n, m;
int a[MAXN][MAXN];
int rmq[MAXN][MAXN][MAXLOG], log[MAXN];

void read()
{
    scanf("%d %d", &n, &m);
    for (int i = 1; i <= n; i++)
		for (int j = 1; j <= n; j++)
			scanf("%d", &a[i][j]);
}

int maxim(int e, int f, int g, int h)
{
    return max(max(e, f), max(g, h));
}

void prepare()
{
    for (int i = 1; i <= n; i++)
		for (int j = 1; j <= n; j++)
			rmq[i][j][0] = a[i][j];
    log[1] = 0;
    for (int i = 2; i <= n; i++)
        if (i >= (1<<(log[i-1]+1)))
			log[i] = log[i-1]+1;
        else
			log[i] = log[i-1];
	for (int k = 1, crt = 1; k < MAXLOG; k++, crt <<= 1)
		for (int i = 1; i <= n; i++)
			for (int j = 1; j <= n; j++) {
                rmq[i][j][k] = rmq[i][j][k-1];
                if (i+crt <= n)
					rmq[i][j][k] = max(rmq[i][j][k], rmq[i+crt][j][k-1]);
				if (j+crt <= n)
					rmq[i][j][k] = max(rmq[i][j][k], rmq[i][j+crt][k-1]);
				if (i + crt <= n && j + crt <= n)
					rmq[i][j][k] = max(rmq[i][j][k], rmq[i+crt][j+crt][k-1]);
			}
}

int query(int x, int y, int k)
{
	int crt = log[k];
    return maxim(rmq[x][y][crt], rmq[x+k-(1<<crt)][y][crt], rmq[x][y+k-(1<<crt)][crt], rmq[x+k-(1<<crt)][y+k-(1<<crt)][crt]);
}

void solve()
{
    for (int i = 1; i <= m; i++) {
		int x, y, k;
		scanf("%d %d %d", &x, &y, &k);
        printf("%d\n", query(x, y, k));
    }
}

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

    read();
    prepare();
    solve();

    return 0;
}