Cod sursa(job #2001685)

Utilizator vladbatalanBatalan Vlad vladbatalan Data 17 iulie 2017 15:00:27
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("plantatie.in");
ofstream fout("plantatie.out");

int n, m, rmq[510][510][11], lg[510];

void precalculare()
{
    for(int i=2;i<=n; i++)
        lg[i] = lg[i/2] + 1;
    for(int k=1; (1<<k) <= 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][j][k-1], rmq[i+(1<<(k-1))][j][k-1]), max(rmq[i][j+(1<<(k-1))][k-1], rmq[i+(1<<(k-1))][j+(1<<(k-1))][k-1]));
}

int query(int x, int y, int d)
{
    int ln = lg[d];
    int sol = max(max(rmq[x][y][ln], rmq[x+d-(1<<ln)][y][ln]), max(rmq[x][y+d-(1<<ln)][ln],rmq[x+d-(1<<ln)][y+d-(1<<ln)][ln]));
    return sol;
}

int main()
{
    int x, y, c;
    fin >> n>> m;
    for(int i=1; i<=n; i++)
        for(int j=1; j<=n; j++)
            fin >> rmq[i][j][0];
    precalculare();
    for(int i=1; i<=m; i++)
    {
        fin >> x >> y >> c;
        fout<<query(x, y, c)<<'\n';
    }
    return 0;
}