Cod sursa(job #1169028)

Utilizator dariusdariusMarian Darius dariusdarius Data 10 aprilie 2014 10:51:30
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.39 kb
#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;
}