Pagini recente » Cod sursa (job #57293) | Cod sursa (job #18572) | Cod sursa (job #1825865) | Cod sursa (job #2552150) | Cod sursa (job #2906644)
#include <bits/stdc++.h>
using namespace std;
ifstream f("plantatie.in");
ofstream g("plantatie.out");
const int N = 501, LOG = log2(N) + 1;
int n, m, x, y, k;
int leaug[N], mat[N][N], r[LOG][N][N]; // coltul din dreapta jos pt. r
void calculeazaLog(){
for(int i = 2; i <= n; i++)
leaug[i] = 1 + leaug[i / 2];
}
inline int max(int a, int b, int c, int d){
return max(max(a, b), max(c, d));
}
void calculeazaVector(){
for(int i = 1; i <= n; i++){
for(int j = 1; j <= n; j++){
for(int e = 0; e <= min(leaug[i], leaug[j]); e++){
if(e == 0)
r[e][i][j] = mat[i][j];
else{
int p = 1 << (e - 1);
r[e][i][j] = max(r[e - 1][i - p][j - p], r[e - 1][i - p][j], r[e - 1][i][j - p], r[e - 1][i][j]);
}
}
}
}
}
int main(){
f >> n >> m;
for(int i = 1; i <= n; i++){
for(int j = 1; j <= n; j++){
f >> mat[i][j]; // aici se odihnesc in pace 45 min. de munca
}
}
calculeazaLog();
calculeazaVector();
while(m--){
f >> x >> y >> k;
int p = 1 << leaug[k];
int l = leaug[k];
g << max(r[l][x + p - 1][y + p - 1], r[l][x + p - 1][y + k - 1], r[l][x + k - 1][y + p - 1], r[l][x + k - 1][y + k - 1]) << '\n';
}
f.close();
g.close();
}