Cod sursa(job #2347387)

Utilizator BogdanAlexandruBogdan-Alexandru Dig BogdanAlexandru Data 18 februarie 2019 18:59:23
Problema Plantatie Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.16 kb
#include <stdio.h>
#define Max(a,b) ( a>b ? a : b)
using namespace std;
FILE *f,*g;
int RMQ[20][510][510];
int log[510],N,M,K;
void CreateLog()
{
    int i;
    for(i=2;i<=N;i++)log[i]=1+log[i/2];
}
void Read()
{
    int i,j;
    fscanf(f,"%d %d",&N,&M);
    for(i=1;i<=N;i++)
        for(j=1;j<=N;j++)fscanf(f,"%d",&RMQ[K][i][j]);
    CreateLog();
}
void CreateRMQ()
{
    int i,j,k,pow;
    for(k=1;k<=log[N];++k)
    {
        pow=(1<<(k-1));
        for(i=1;i<=(N+1)-(1<<k);++i)
            for(j=1;j<=(N+1)-(1<<k);++j)
                RMQ[k][i][j]=Max(Max(RMQ[k-1][i][j],RMQ[k-1][i+pow][j]),Max(RMQ[k-1][i+pow][j+pow],RMQ[k-1][i][j+pow]));
    }
}
void Solve()
{
    int M1,M2,X,Y,L,Level;
    while(M)
    {
        --M;
        fscanf(f,"%d%d%d",&X,&Y,&L);
        Level=log[Y-X+1];
        M1=Max(RMQ[Level][X][Y],RMQ[Level][X][Y+L-(1<<Level)]);
        M2=Max(RMQ[Level][X+L-(1<<Level)][Y],RMQ[Level][X+L-(1<<Level)][Y+L-(1<<Level)]);
        fprintf(g,"%d\n",Max(M1,M2));
    }
}
int main()
{
    f=fopen("plantatie.in","r");g=fopen("plantatie.out","w");
    Read();CreateRMQ();Solve();
    fclose(f);fclose(g);
    return 0;
}