Cod sursa(job #2451128)

Utilizator Senth30Denis-Florin Cringanu Senth30 Data 25 august 2019 20:31:50
Problema Plantatie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.18 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 afis(int l){
    for(int i = 0; i < N; i++){
        for(int j = 0; j < N; j++){
            printf("%d", rmq[i][j][l]);
            if(rmq[i][j][l] > 9) printf(" ");
            else printf("  ");
        }
        printf("\n");
    }
    printf("\n\n");
}

int main(){

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

    read();
    createlg();

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

    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;
}