Pagini recente » Cod sursa (job #1401349) | Cod sursa (job #2972195) | Cod sursa (job #3207267) | Cod sursa (job #1021716) | Cod sursa (job #2772123)
#include <bits/stdc++.h>
#define MAXN 502
#define putere 9
using namespace std;
ifstream fin("plantatie.in");
ofstream fout("plantatie.out");
int n, m, a[MAXN][MAXN][putere], powers[putere], floorExponent[MAXN];
int main()
{
fin>>n>>m;
for(int i=0; i<n; i++){
for(int j=0; j<n; j++){
fin>>a[i][j][0];//citim primul nivel
}
}
int index=1;
powers[0]=1;
for(int i=1; i<putere; i++){
powers[i]=powers[i-1]<<1;
}
floorExponent[1]=0;
int nextPowerOf2=2;
for(int i=2; i<=n; i++){//precalculam cea mai mare putere de 2 mai mica decat n
if(i==nextPowerOf2){//la putere de 2
floorExponent[i]=floorExponent[i-1]+1;
nextPowerOf2<<=1;//actualizam lucrurile
}
else{
floorExponent[i]=floorExponent[i-1];//sau altfel, pastram asa cum e
}
}
for(int k=1; k<index; k++){//facem pd
for(int i=0; i<n; i++){//luam nivelul la puricat
for(int j=0; j<n; j++){
a[i][j][k]=max(a[i][j][k-1],
(max(a[i+powers[k-1]][j][k-1],
(max(a[i][j+powers[k-1]][k-1],
a[i+powers[k-1]][j+powers[k-1]][k-1])))));
//maximul din cele 4 subpatrate care acopera totul, cu un noian de suprapuneri
}
}
}
for(int i=0; i<m; i++){
int lin, col, lg; fin>>lin>>col>>lg;
lin--; col--;
int part=floorExponent[lg];//il definesc ca sa scurtez formula, care e oricum lunga
fout<<max(a[lin][col][part],max(a[lin+lg-powers[part]][col][part], max(a[lin][col+lg-powers[part]][part], a[lin+lg-powers[part]][col+lg-powers[part]][part])))<<"\n";
}
return 0;
}