Cod sursa(job #1080626)

Utilizator Iustin_BulimarFMI Iustin Bulimar Iustin_Bulimar Data 12 ianuarie 2014 18:23:17
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.35 kb
#include <fstream>
using namespace std;
ifstream cin("plantatie.in");
ofstream cout("plantatie.out");

const int n_max=501;
const int log_n_max=9;

int n, m, i, j, k, rm[n_max][n_max][log_n_max];

int maxim(int i, int j, int k)
{
    int mx;
    mx=rm[i][j][k-1];
    if(rm[i+(1<<(k-1))][j][k-1] > mx)
        mx=rm[i+(1<<(k-1))][j][k-1];
    if(rm[i][j+(1<<(k-1))][k-1] > mx)
        mx=rm[i][j+(1<<(k-1))][k-1];
    if(rm[i+(1<<(k-1))][j+(1<<(k-1))][k-1] > mx)
        mx=rm[i+(1<<(k-1))][j+(1<<(k-1))][k-1];
    return mx;
}

void RMQ()
{
    int i, j, k;
    for(k=1; (1<<k)<=n; k++)
        for(i=1; i+(1<<k)-1<=n; i++)
            for(j=1; j+(1<<k)-1<=n; j++)
                rm[i][j][k]=maxim(i, j, k);
}

int query(int i, int j, int k)
{
    int log=1, mx;
    while((1<<log)<=k)
        log++;
    log--;
    mx=rm[i][j][log];
    if(rm[i+k-(1<<log)][j][log] > mx)
        mx=rm[i+k-(1<<log)][j][log];
    if(rm[i][j+k-(1<<log)][log] > mx)
        mx=rm[i][j+k-(1<<log)][log];
    if(rm[i+k-(1<<log)][j+k-(1<<log)][log] > mx)
        mx=rm[i+k-(1<<log)][j+k-(1<<log)][log];
    return mx;

}
int main()
{
    cin>>n>>m;
    for(i=1; i<=n; i++)
        for(j=1; j<=n; j++)
            cin>>rm[i][j][0];
    RMQ();
    while(m--)
    {
        cin>>i>>j>>k;
        cout<<query(i, j, k)<<'\n';
    }
    return 0;
}