Pagini recente » Cod sursa (job #1928723) | Cod sursa (job #2529999) | Cod sursa (job #2767521) | Cod sursa (job #3226221) | Cod sursa (job #2772229)
#include <bits/stdc++.h>
#define MAXN 502
#define putere 11
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;
while(powers[index-1]<n){
powers[index]=powers[index-1]<<1;//puterile lui 2
index++;
}
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++){
int startLine=min(i+powers[k-1], n), startCol=min(j+powers[k-1], n);
a[i][j][k]=max(a[i][j][k-1],
(max(a[startLine][j][k-1],
(max(a[i][startCol][k-1],
a[startLine][startCol][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;
}