Cod sursa(job #2480591)

Utilizator MatteoalexandruMatteo Verzotti Matteoalexandru Data 25 octombrie 2019 20:19:27
Problema Plantatie Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.28 kb
#include <fstream>
#include <cstdio>

using namespace std;

const int N = 500;

int MAX(int a, int b, int c, int d){
    return max(a, max(b, max(c, d)));
}
ifstream cin ("plantatie.in");
ofstream cout ("plantatie.out");

int rmq[10][5 + N][5 + N];
int log[5 + N];

int main()
{
    //freopen("plantatie.in", "r", stdin);
    //freopen("plantatie.out", "w", stdout);
    ios_base::sync_with_stdio(false);
    int n, m, i, j;
    cin >> n >> m;
    for(i = 1; i <= n; i++){
        for(j = 1; j <= n; j++){
            cin >> rmq[0][i][j];
        }
    }
    log[1] = 0;
    for(i = 2; i <= n; i++) log[i] = log[i >> 1] + 1;

    for(int x = 1; x <= log[n]; x++){
        int lung = 1 << x;
        for(i = 1; i + lung <= n + 1; i++){
            for(j = 1; j + lung <= n + 1; j++){
                rmq[x][i][j] = MAX(rmq[x-1][i][j], rmq[x-1][i + lung / 2][j], rmq[x-1][i][j + lung / 2], rmq[x-1][i + lung / 2][j + lung / 2]);
            }
        }
    }

    for(i = 1; i <= m; i++){
        int p, q, k, x;
        int p0, q0;
        cin >> p >> q >> k;
        x = log[k];
        int lung = 1 << x;
        p0 = p + k - 1;
        q0 = q + k - 1;
        printf("%d\n", MAX(rmq[x][p][q], rmq[x][p][q0 - lung + 1], rmq[x][p0 - lung + 1][q], rmq[x][p0 - lung + 1][q0 - lung + 1]));
    }
    return 0;
}