Pagini recente » Cod sursa (job #1316619) | Cod sursa (job #3268712) | Cod sursa (job #3208054) | Cod sursa (job #2934975) | Cod sursa (job #3269155)
#include <bits/stdc++.h>
using namespace std;
/**
RMQ 2D
Vrem sa stim valoarea maxima de pe o submatrice patratica
de latura 2^e si care are coltul stanga sus in (i,j)
rmq[e][i][j] = maximul din submat. cu coltul stg-sus in (i,j)
si cu latura 2^e
*/
ifstream fin("plantatie.in");
ofstream fout("plantatie.out");
int n, m;
int rmq[10][505][505];
int e[505], L[20];
int main()
{
int i, j, x, y, len, k;
/// construim pe L
L[0] = 1;
for (i = 1; i <= 9; i++)
L[i] = L[i - 1] * 2;
/// construim e
e[1] = 0;
for (i = 2; i <= 500; i++)
e[i] = 1 + e[i / 2];
fin >> n >> m;
for (i = 1; i <= n; i++)
for (j = 1; j <= n; j++)
fin >> rmq[0][i][j];
/// recurentele:
for (k = 1; k <= e[n]; k++)
{
len = L[k - 1]; /// 2^k
for (i = 1; i <= n - len + 1; i++)
for (j = 1; j <= n - len + 1; j++)
rmq[k][i][j] = max({rmq[k-1][i][j], rmq[k-1][i+len][j],
rmq[k-1][i][j+len], rmq[k-1][i+len][j+len]});
}
while (m--)
{
fin >> i >> j >> k;
y = e[k];
len = L[y];
fout << max({rmq[y][i][j], rmq[y][i][j + k - len],
rmq[y][i + k - len][j], rmq[y][i + k - len][j + k - len]}) << "\n";
}
return 0;
}