Cod sursa(job #2451172)

Utilizator GabiTulbaGabi Tulba-Lecu GabiTulba Data 25 august 2019 23:52:33
Problema Plantatie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.35 kb
#include <bits/stdc++.h>
#define MAX 131072

using namespace std;
const int NMAX = 505;

FILE *IN;

int N, M;
int lg[NMAX];
int rmq[NMAX][NMAX][10];

int pos, sign;
char f[MAX];

inline void Read(int &nr){
    sign = 0;
    nr = 0;
    while(f[pos] < '0' || f[pos] > '9'){
        if(f[pos] == '-') sign=1;
        pos++;
        if(pos == MAX)
            fread(f, MAX, 1, IN), pos = 0;
    }
    while(f[pos] >= '0' && f[pos] <= '9'){
        nr = 10 * nr + f[pos++] - '0';
        if(pos == MAX)
            fread(f, MAX, 1, IN), pos = 0;
    }
    if(sign) nr =- nr;
}

inline int read(){
    int a;
    Read(N); Read(M);
    for(int i = 1; i <= N; i++){
        for(int j = 1; j <= N; j++){
            Read(a);
            rmq[i][j][0] = a;
        }
    }
}

inline int createlg(){
    int cnt = 2;
    lg[1] = 0;
    for(int i = 2; i <= N; i++){
        if(i == cnt) cnt *= 2, lg[i] = lg[i - 1] + 1;
        else lg[i] = lg[i - 1];
    }
}

int main(){

    IN = fopen("plantatie.in", "r");
    freopen("plantatie.out", "w", stdout);

    read();
    createlg();

    for(int k = 1; k <= lg[N]; k++){
        for(int i = 1; i <= N; i++){
            for(int j = 1; j <= N; j++){
                if(i + (1 << (k - 1)) <= N && j + (1 << (k - 1)) <= N){
                    int a = max(rmq[i][j][k - 1], rmq[i + (1 << (k - 1))][j][k - 1]);
                    int b = max(rmq[i][j + (1 << (k - 1))][k - 1], rmq[i + (1 << (k - 1))][j + (1 << (k - 1))][k - 1]);
                    rmq[i][j][k] = max(a, b);
                } else if(i + (1 << (k - 1)) <= N && j + (1 << (k - 1)) > N)
                    rmq[i][j][k] = max(rmq[i][j][k - 1], rmq[i + (1 << (k - 1))][j][k - 1]);
                else if(i + (1 << (k - 1)) > N && j + (1 << (k - 1)) <= N)
                    rmq[i][j][k] = max(rmq[i][j][k - 1], rmq[i][j + (1 << (k - 1))][k - 1]);
                else
                    rmq[i][j][k] = rmq[i][j][k - 1];
            }
        }
    }

    int ans;
    int L, x, y;
    for(int i = 1; i <= M; i++){
        Read(x); Read(y); Read(L);
        int a = max(rmq[x][y][lg[L]], rmq[x][y + L - (1 << lg[L])][lg[L]]);
        int b = max(rmq[x + L - (1 << lg[L])][y][lg[L]], rmq[x + L - (1 << lg[L])][y + L - (1 << lg[L])][lg[L]]);
        ans = max(a, b);
        printf("%d\n", ans);
    }

    return 0;
}