Cod sursa(job #2077247)

Utilizator mihailrazMihail Turcan mihailraz Data 27 noiembrie 2017 20:35:37
Problema Plantatie Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.73 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fi("plantatie.in");
ofstream fo("plantatie.out");
int N,M;
int LOG[505];
int A[505][505],RMQ[505][505][10];

void citire_matrice(void)
{
    fi>>N>>M;
    for(int i=1; i<=N; i++)
        for(int j=1; j<=N; j++)
            fi>>A[i][j];
}

void precalculare_log(void)
{
    LOG[1]=0;
    for(int i=2; i<=N; i++)
        LOG[i]=LOG[i/2]+1;
}

void precalculare_tablou(void)
{
    for(int i=1; i<=N; i++)
        for(int j=1; j<=N; j++)
            RMQ[i][j][0]=A[i][j];
    /**for(int i=1; i<=N; i++)
    {
        for(int j=1; j<=N; j++)
            fo<<RMQ[i][j][0]<<" ";
        fo<<"\n";
    }*/
    for(int k=1; k<=LOG[N]; k++)
        for(int i=1; i<=N; i++)
            for(int j=1; j<=N; j++)
            {
                RMQ[i][j][k]=max(RMQ[i][j][k-1],RMQ[i+(1<<(k-1))][j][k-1]);
                RMQ[i][j][k]=max(RMQ[i][j][k],RMQ[i][j+(1<<(k-1))][k-1]);
                RMQ[i][j][k]=max(RMQ[i][j][k],RMQ[i+(1<<(k-1))][j+(1<<(k-1))][k-1]);
            }
}

void rezolvare_query(void)
{
    int i,j,k,range;
    if(k==1)
    {
        fo<<A[i][j]<<"\n";
        return;
    }
    while(M--)
    {
        fi>>i>>j>>k;
        range=LOG[k];
        fo<<max(RMQ[i][j][range],max(RMQ[i+k-(1<<range)][j][range],max(RMQ[i][j+k-(1<<range)][range],RMQ[i+k-(1<<range)][j+k-(1<<range)][range])));
        fo<<"\n";
    }
}

int main()
{
    citire_matrice();
    precalculare_log();
    precalculare_tablou();
    rezolvare_query();
    /**for(int i=1; i<=N; i++)
    {
        for(int j=1; j<=N; j++)
        {
                fo<<RMQ[i][j][1]<<" ";
        }
        fo<<"\n";
    }*/
    fi.close();
    fo.close();
    return 0;
}