Pagini recente » Cod sursa (job #2632741) | Cod sursa (job #2051843) | Cod sursa (job #181664) | Cod sursa (job #2875840) | Cod sursa (job #2753583)
#include <bits/stdc++.h>
/// https://codeforces.com/blog/entry/45485
using namespace std;
ifstream fin("plantati.in");
ofstream fout("plantatie.out");
const int NMAX = 500;
const int LGMAX = 9;
int n, m;
int Log[NMAX];
int M[LGMAX][NMAX][NMAX]; /// facem un RMQ cu un tablou 3D
/// M[L][x][y] -> maximul din matricea ce are coltul din stanga sus in (x, y)
/// si lungimea laturii de 2^L
/// matricea este deja initializata cu 0-> nu influenteaza valoarea maximului
inline int find_max(int x1, int x2, int x3, int x4){
x1 = max(x1, x2);
x3 = max(x3, x4);
return max(x1, x3);
}
void precalculare(){
Log[1]=0;
for (int i = 2; i <= n; i ++)
Log[i] = Log[i / 2] + 1; /// precalculare pentru logaritmi
for(int k = 1; (1 << k) <= n; k ++)
for(int i = 1; i <= n; i ++)
for(int j = 1; j <=n; j ++){ /// despartim matricea curenta in 4 si calculam maximul pe baza celor anterioare
int lg = 1 << (k - 1);
M[k][i][j] = find_max(M[k - 1][i][j], M[k - 1][i][j + lg - 1], M[k - 1][i +lg - 1][j], M[k - 1][i + lg - 1][j + lg - 1]);
///N-V ///N-E /// S-V /// S-E
}
}
inline int query(int x, int y, int lg){
int k = Log[lg]; /// impartim matricea in 4 matrice de lungime log2 (lg)
int pow2 = 1 << k;
return find_max(M[k][x][y], M[k][x][y + lg - pow2], M[k][x + lg - pow2][y], M[k][x + lg - pow2][y + lg - pow2]);
}
int main()
{
int x, y, lg;
fin>>n>>m;
for(int i = 1; i <= n; i ++)
for(int j = 1; j <= n; j ++)
fin>>M[0][i][j];
precalculare();
for(int i = 1; i <= m; i ++){
fin>>x>>y>>lg;
fout<<query(x, y, lg)<<"\n";
}
return 0;
}