Pagini recente » Borderou de evaluare (job #1738327) | Borderou de evaluare (job #2553182) | Cod sursa (job #2652704) | Borderou de evaluare (job #423089) | Cod sursa (job #3261923)
#include <fstream>
#include <vector>
using namespace std;
ifstream cin("plantatie.in");
ofstream cout("plantatie.out");
vector<vector<vector<int>>> r;
vector<int> E;
int n, m, x, y, z;
void precalc()
{
for(int p=1; (1<<p) <= n; p++)
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++)
{
int inou = i + (1 << p);
int jnou = j + (1 << p);
r[p][i][j] = r[p-1][i][j];
if(inou <= n)
r[p][i][j] = max(r[p][i][j], r[p-1][inou][j]);
if(jnou <= n)
r[p][i][j] = max(r[p][i][j], r[p-1][i][jnou]);
if(inou <= n && jnou <= n)
r[p][i][j] = max(r[p][i][j], r[p-1][inou][jnou]);
}
for(int i=2; i<=n; i++)
E[i] = E[i / 2] + 1;
}
int main()
{
cin >> n >> m;
r.assign(20, vector<vector<int>>(n+1, vector<int>(n+1, 0)));
E.resize(20);
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++)
cin >> r[0][i][j];
while(m--)
{
cin >> x >> y >> z;
int k = E[z];
int len = (1 << k);
int inou = x + z - len;
int jnou = y + z - len;
cout << max(max(r[k][x][y], r[k][x][jnou]), max(r[k][inou][y], r[k][inou][jnou])) << '\n';
}
return 0;
}