Cod sursa(job #2906644)

Utilizator CaptnBananaPetcu Tudor CaptnBanana Data 26 mai 2022 21:15:56
Problema Plantatie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.41 kb
#include <bits/stdc++.h>

using namespace std;

ifstream f("plantatie.in");
ofstream g("plantatie.out");

const int N = 501, LOG = log2(N) + 1;
int n, m, x, y, k;
int leaug[N], mat[N][N], r[LOG][N][N]; // coltul din dreapta jos pt. r

void calculeazaLog(){
    for(int i = 2; i <= n; i++)
        leaug[i] = 1 + leaug[i / 2];
}

inline int max(int a, int b, int c, int d){
    return max(max(a, b), max(c, d));
}

void calculeazaVector(){
    for(int i = 1; i <= n; i++){
        for(int j = 1; j <= n; j++){
            for(int e = 0; e <= min(leaug[i], leaug[j]); e++){
                if(e == 0)
                    r[e][i][j] = mat[i][j];
                else{
                    int p = 1 << (e - 1);
                    r[e][i][j] = max(r[e - 1][i - p][j - p], r[e - 1][i - p][j], r[e - 1][i][j - p], r[e - 1][i][j]);
                }

            }
        }
    }
}

int main(){
    f >> n >> m;
    for(int i = 1; i <= n; i++){
        for(int j = 1; j <= n; j++){
            f >> mat[i][j]; // aici se odihnesc in pace 45 min. de munca
        }
    }

    calculeazaLog();
    calculeazaVector();

    while(m--){
        f >> x >> y >> k;
        int p = 1 << leaug[k];
        int l = leaug[k];
        g << max(r[l][x + p - 1][y + p - 1], r[l][x + p - 1][y + k - 1], r[l][x + k - 1][y + p - 1], r[l][x + k - 1][y + k - 1]) << '\n';
    }

    f.close();
    g.close();
}