Pagini recente » Cod sursa (job #3151838) | Cod sursa (job #2298520) | Cod sursa (job #573099) | Cod sursa (job #2437042) | Cod sursa (job #2865788)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("plantatie.in");
ofstream fout("plantatie.out");
int n, Q, e[505];
int rmq[9][505][505];
/**
e[i] = exponentul maxim cu prop.
ca 2^e[i] <= i
rmq[k][i][j] = valoarea maxima din
submatrice care are coltul din
stanga-sus in (i,j) si are latura
egala cu 2^k
rmq[0][i][j] = a[i][j]
*/
void MakeE()
{
int i;
e[1] = 0;
for (i = 2; i <= n; i++)
e[i] = 1 + e[i / 2];
}
int main()
{
int i, j, k, L, dk, lat, x;
fin >> n >> Q;
MakeE();
for (i = 1; i <= n; i++)
for(j = 1; j <= n; j++)
fin >> rmq[0][i][j];
for (k = 1; k <= e[n]; k++)
{
dk = (1 << k);
L = (1 << (k-1));
for (i = 1; i <= n-dk+1; i++)
for (j = 1; j <= n-dk+1; j++)
rmq[k][i][j] = max({rmq[k-1][i][j],
rmq[k-1][i][j+L], rmq[k-1][i+L][j],
rmq[k-1][i+L][j+L]});
}
while (Q--)
{
fin >> i >> j >> lat;
if (lat == 1)
{
fout << rmq[0][i][j] << "\n";
}
else
{
dk = (1 << e[lat]);
k = e[lat];
x = max({rmq[k][i][j],
rmq[k][i][j+lat-dk], rmq[k][i+lat-dk][j],
rmq[k][i+lat-dk][j+lat-dk]});
fout << x << "\n";
}
}
return 0;
}