Cod sursa(job #1456096)

Utilizator fluture.godlikeGafton Mihnea Alexandru fluture.godlike Data 29 iunie 2015 19:28:05
Problema Plantatie Scor 50
Compilator cpp Status done
Runda mpractice1 Marime 1.32 kb
#include <cstdio>
#include <algorithm>
#define NMAX 507
#define inf 1000000023
using namespace std;
FILE *fin, *fout;
int log(int x)
{
    int sol = 1, ans = 0;
    for(;sol <= x;ans++) sol<<=1;
    sol>>=1;
    ans--;
    return ans;
}
int rmq[NMAX][NMAX][107], n, m, q1, q2, q3;
int query(int x, int y, int p)
{
    int lg = log(p), ans;
    ans = max(max(rmq[x][y][lg], rmq[x + p - (1<<lg)][y + p - (1<<lg)][lg]), max(rmq[x + p - (1<<lg)][y][lg], rmq[x][y + p - (1<<lg)][lg]));
    return ans;
}
int main()
{
    fin = freopen("plantatie.in", "r", stdin);
    fout = freopen("plantatie.out", "w", stdout);
    scanf("%d%d", &n, &m);
    for(int i = 1; i<= n; i++)
    {
        for(int j = 1; j<= n; j++)
        {
            scanf("%d", &rmq[i][j][0]);
        }
    }
    for(int k = 1; k<= log(n); k++)
    {
        for(int i = 1; i<= n - (1<<k) + 1; i++)
        {
            for(int j = 1; j<= n - (1<<k) + 1; j++)
            {
                rmq[i][j][k] = max(max(rmq[i+(1<<(k-1))][j][k-1], rmq[i][j+(1<<(k-1))][k-1]), max(rmq[i][j][k-1], rmq[i+(1<<(k-1))][j+(1<<(k-1))][k-1]));
            }
        }
    }
    for(int i = 1; i<= m; i++)
    {
        scanf("%d%d%d", &q1, &q2, &q3);
        printf("%d\n", query(q1, q2, q3));
    }
    fclose(fin);
    fclose(fout);
    return 0;
}