Pagini recente » Borderou de evaluare (job #366981) | Cod sursa (job #19378) | Cod sursa (job #2371759) | Cod sursa (job #2930346) | Cod sursa (job #3232321)
#include <bits/stdc++.h>
using namespace std;
ifstream f("plantatie.in");
ofstream g("plantatie.out");
void calculate_logs(vector<int>& lg, int length) {
lg[1] = 0;
for(int i = 2; i <= length; ++i)
lg[i] = lg[i >> 1] + 1;
}
int main() {
int n, m, i, j, x, y, k, l, c, max_R1, max_R2;
f >> n >> m;
vector<int> lg(n + 1);
calculate_logs(lg, n);
vector<vector<int>> arr(n, vector<int>(n));
vector<vector<vector<vector<int>>>> sp_table(lg[n] + 1, vector<vector<vector<int>>>(n, vector<vector<int>>(lg[n] + 1, vector<int>(n))));
for(i = 0; i < n; ++i)
for(j = 0; j < n; ++j)
f >> sp_table[0][i][0][j];
for(l = 0; l < n; ++l)
for(i = 1; i <= lg[n]; ++i)
for(j = 0; j + (1 << (i - 1)) < n; ++j)
sp_table[0][l][i][j] = max(sp_table[0][l][i - 1][j], sp_table[0][l][i - 1][j + (1 << (i - 1))]);
for(i = 1; i <= lg[n]; ++i)
for(j = 0; j + (1 << (i - 1)) < n; ++j)
for(l = 0; l <= lg[n]; ++l)
for(c = 0; c < n; ++c)
sp_table[i][j][l][c] = max(sp_table[i - 1][j][l][c], sp_table[i - 1][j + (1 << (i - 1))][l][c]);
for(i = 0; i < m; ++i) {
f >> x >> y >> k;
--x;
--y;
int kx = lg[k];
int ky = kx;
max_R1 = max(sp_table[kx][x][ky][y], sp_table[kx][x][ky][y + k - (1 << ky)]);
max_R2 = max(sp_table[kx][x + k - (1 << kx)][ky][y], sp_table[kx][x + k - (1 << kx)][ky][y + k - (1 << ky)]);
g << max(max_R1, max_R2) << '\n';
}
return 0;
}