Cod sursa(job #1955460)

Utilizator nicu_serteSerte Nicu nicu_serte Data 5 aprilie 2017 23:38:48
Problema Plantatie Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.16 kb
#include <fstream>
using namespace std;
ifstream fin("plantatie.in");
ofstream fout("plantatie.out");
int ter[505][505], n, m, a[505][505][10];
void citire()
{
    int i, j;
    fin>>n>>m;
    for(i=1; i<=n; i++)
        for(j=1; j<=n; j++)
            fin>>ter[i][j];
}
int maxim(int a, int b, int c, int d)
{
    return max(max(a, b), max(c, d));
}
void preprocesare()
{
    int i, j, k;
    for(i=1; i<=n; i++)
        for(j=1; j<=n; j++)
            a[i][j][0]=ter[i][j];
    for(k=1; (1<<k)<=n; k++)
        for(i=1; i<=n; i++)
            for(j=1; j<=n; j++)
                a[i][j][k]=maxim(a[i][j][k-1], a[i][j+(1<<(k-1))][k-1], a[i+(1<<(k-1))][j][k-1], a[i+(1<<(k-1))][j+(1<<(k-1))][k-1]);
}
int query(int i, int j, int k)
{
    int p, s;
    p=0; s=1;
    while(s<=k)
    {
        s=s*2;
        p++;
    }
    if(s>k)
    {
        s=s/2;
        p--;
    }
    return maxim(a[i][j][p], a[i][j+k-s][p], a[i+k-s][j][p], a[i+k-s][j+k-s][p]);
}
int main()
{
    int i, j, k;
    citire();
    preprocesare();
    while(m)
    {
        m--;
        fin>>i>>j>>k;
        fout<<query(i, j, k)<<'\n';
    }
    return 0;
}