Pagini recente » Cod sursa (job #2371396) | Cod sursa (job #2160055) | Cod sursa (job #1217361) | Cod sursa (job #1894901) | Cod sursa (job #2347391)
#include <stdio.h>
#define Max(a,b) ( a>b ? a : b)
using namespace std;
FILE *f,*g;
int RMQ[20][610][610];
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)///formez RMQ
{
pow=(1<<(k-1));
for(i=1;i+(1<<k)<=N;++i)
for(j=1;j+(1<<k)<=N;++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)///separ fiecare portiunea in 4 portiuni si calculez maximul dintre ele
{
--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;
}