Pagini recente » Cod sursa (job #367947) | Cod sursa (job #638621) | Cod sursa (job #1322995) | Cod sursa (job #1236546) | Cod sursa (job #1169028)
#include <algorithm>
#include <fstream>
#include <iostream>
using namespace std;
const int MAX_N = 505;
const int BUFFER_SIZE = 1 << 16;
int lg[MAX_N];
int rmq[9][MAX_N][MAX_N];
class InputReader {
public:
InputReader() {}
InputReader(const char* filename) {
file = fopen(filename, "r");
cursor = 0;
fread(buffer, BUFFER_SIZE, 1, file);
}
inline InputReader & operator >> (int &value) {
while(!isdigit(buffer[cursor])) {
advance();
}
value = 0;
while(isdigit(buffer[cursor])) {
value = value * 10 + buffer[cursor] - '0';
advance();
}
return *this;
}
private:
FILE* file;
int cursor;
char buffer[BUFFER_SIZE];
inline void advance() {
++ cursor;
if(cursor == BUFFER_SIZE) {
cursor = 0;
fread(buffer, BUFFER_SIZE, 1, file);
}
}
};
int main() {
InputReader fin("plantatie.in");
ofstream fout("plantatie.out");
int n, q;
fin >> n >> q;
//cout << "0:\n";
for(int i = 1; i <= n; ++ i) {
for(int j = 1; j <= n; ++ j) {
fin >> rmq[0][i][j];
//cout << rmq[0][i][j] << (j == n ? '\n' : ' ');
}
}
for(int l = 1; (1 << l) <= n; ++ l) {
//cout << l << ":\n";
for(int i = 1; i + (1 << l) - 1 <= n; ++ i) {
for(int j = 1; j + (1 << l) - 1 <= n; ++ j) {
rmq[l][i][j] = rmq[l - 1][i][j];
rmq[l][i][j] = max(rmq[l][i][j], rmq[l - 1][i + (1 << (l - 1))][j]);
rmq[l][i][j] = max(rmq[l][i][j], rmq[l - 1][i][j + (1 << (l - 1))]);
rmq[l][i][j] = max(rmq[l][i][j], rmq[l - 1][i + (1 << (l - 1))][j + (1 << (l - 1))]);
//cout << rmq[l][i][j] << (j + (1 << l) - 1 == n ? '\n' : ' ');
}
}
}
lg[1] = 0;
for(int i = 2; i <= n; ++ i) {
lg[i] = lg[i / 2] + 1;
}
for(int i = 1; i <= q; ++ i) {
int x, y, k, l;
fin >> x >> y >> k;
l = 1 << lg[k];
int answer = rmq[lg[k]][x][y];
answer = max(answer, rmq[lg[k]][x + k - l][y]);
answer = max(answer, rmq[lg[k]][x][y + k - l]);
answer = max(answer, rmq[lg[k]][x + k - l][y + k - l]);
fout << answer << "\n";
}
return 0;
}