Pagini recente » Cod sursa (job #887070) | Cod sursa (job #1296794) | Cod sursa (job #346874) | Cod sursa (job #1354751) | Cod sursa (job #2847368)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("plantatie.in");
ofstream fout("plantatie.out");
int n, m;
int a[505][505];
int dp[505][505][11];
int p[505];
void Citire()
{
int i, j;
fin >> n >> m;
for(i = 1;i <= n;i++)
for(j = 1;j <= n;j++)
fin >> a[i][j];
}
void RMQ2D()
{
int i, j, k;
p[1] = 0;
for(i = 2;i <= n;i++)
p[i] = p[i / 2] + 1;
int N = p[n];
for(i = 1;i <= n;i++)
for(j = 1;j <= n;j++)
dp[i][j][0] = a[i][j];
for(k = 1;k <= N;k++)
{
int pmax = n - (1 << (k - 1));
for(i = 1;i <= pmax;i++)
for(j = 1;j <= pmax;j++)
dp[i][j][k] = max(dp[i][j + (1 << k - 1)][k - 1],
max(dp[i + (1 << k - 1)][j][k - 1],
max(dp[i + (1 << (k - 1))][j + (1 << (k - 1))][k - 1], dp[i][j][k - 1])));
}
}
int Solve(int i, int j, int k)
{
int pau = p[k];
int sol;
int pozi = i + k - (1 << pau);
int pozj = j + k - (1 << pau);
sol = max(dp[i][j][pau], dp[pozi][j][pau]);
sol = max(sol, dp[pozi][pozj][pau]);
sol = max(sol, dp[i][pozj][pau]);
return sol;
}
void Queries()
{
int i, x, y, k;
for(i = 1;i <= m;i++)
{
fin >> x >> y >> k;
fout << Solve(x, y, k) << "\n";
}
}
int main()
{
Citire();
RMQ2D();
Queries();
return 0;
}