Cod sursa(job #1755911)

Utilizator Burbon13Burbon13 Burbon13 Data 11 septembrie 2016 13:47:57
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.26 kb
/// RMQ
#include <cstdio>
#include <iostream>
#include <algorithm>

using namespace std;

const int nmx = 502;

int n,m;
int dp[nmx][nmx][8];

int max4(int v1, int v2, int v3, int v4)
{
    return max(max(v1,v2),max(v3,v4));
}

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

void range_minimum_query()
{
    for(int pt = 1; (1 << pt) <= n + 1; ++pt)
        for(int i = 1; i + (1 << pt) <= n + 1; ++i)
            for(int j = 1; j + (1 << pt) <= n + 1; ++j)
                dp[i][j][pt] = max4(dp[i][j][pt-1],dp[i][j+(1 << (pt - 1))][pt-1],dp[i + (1 << (pt - 1))][j][pt-1],dp[i + (1 << (pt - 1))][j + (1 << (pt - 1))][pt - 1]);
}

void queries()
{
    for(int i = 1; i <= m; ++i)
    {
        int x,y,k;
        scanf("%d %d %d", &x, &y, &k);

        int xf = x + k, yf = y + k;

        int put = log2(k);
        int pt2 = (1 << put);

        printf("%d\n", max4(dp[x][y][put],dp[x][yf-pt2][put],dp[xf-pt2][y][put],dp[xf-pt2][yf-pt2][put]));
    }
}

int main()
{
    freopen("plantatie.in", "r", stdin);
    freopen("plantatie.out", "w", stdout);
    citire();
    range_minimum_query();
    queries();
    return 0;
}