Cod sursa(job #1602151)

Utilizator ciocan_catalinCiocan Catalin - Iulian ciocan_catalin Data 16 februarie 2016 16:41:05
Problema Plantatie Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.17 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin("plantatie.in");
ofstream fout("plantatie.out");
int n,M,P2[515],rmq[505][505][11],a[505][505];
void Build_P2()
{
    P2[1] = 0;
    for(int i = 2;i<=n;i++)
        P2[i] = 1+P2[i/2];
}
void Read()
{
    int i,j;
    fin>>n>>M;
    for(i = 1 ; i <= n ; i++)
        for(j = 1; j <= n ; j++)
            fin>>a[i][j];
}

void RMQ()
{
    int i,j,k,N,p;
    N = P2[n];
    for(i = 1; i <= n; i++)
        for(j = 1; j <= n; j++)
            rmq[i][j][0] = a[i][j];
    for(k = 1; k <= N; k++)
         for(i = 1; i <= n; i++)
            for(j = 1; j <= n; j++)
            {
                p = 1<<(k-1);
                rmq[i][j][k] = max(max(rmq[i][j][k-1],rmq[i+p][j][k-1]),max(rmq[i][j+p][k-1],rmq[i+p][j+p][k-1]));
            }
}

void Write()
{
    int MX,p,i,j,k;
    while(M--)
    {
        fin>>i>>j>>k;
        p = P2[k];
        MX = max(max(rmq[i][j][p],rmq[i][j+k-(1<<p)][p]),max(rmq[i+k-(1<<p)][j][p],rmq[i+k-(1<<p)][j+k-(1<<p)][p]));
        fout<<MX<<"\n";
    }
}
int main()
{
    Read();
    Build_P2();
    RMQ();
    Write();
    fout.close();
    return 0;
}