Cod sursa(job #2753585)

Utilizator MateiDorian123Nastase Matei MateiDorian123 Data 23 mai 2021 15:34:45
Problema Plantatie Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.82 kb
#include <bits/stdc++.h>
/// https://codeforces.com/blog/entry/45485

using namespace std;
ifstream fin("plantatie.in");
ofstream fout("plantatie.out");

const int NMAX = 500;
const int LGMAX = 9;

int n, m;
int Log[NMAX];
int M[LGMAX][NMAX][NMAX]; /// facem un RMQ cu un tablou 3D
/// M[L][x][y] -> maximul din matricea ce are coltul din stanga sus in (x, y)
///               si lungimea laturii de 2^L
/// matricea este deja initializata cu 0-> nu influenteaza valoarea maximului


inline int find_max(int x1, int x2, int x3, int x4){
    x1 = max(x1, x2);
    x3 = max(x3, x4);
    return max(x1, x3);
}

void precalculare(){

    Log[1]=0;
	for (int i = 2; i <= n; i ++)
		Log[i] = Log[i / 2] + 1; /// precalculare pentru logaritmi

    for(int k = 1; (1 << k) <= n; k ++)
        for(int i = 1; i <= n; i ++)
            for(int j = 1; j <=n; j ++){ /// despartim matricea curenta in 4 si calculam maximul pe baza celor anterioare
                int lg = 1 << (k - 1);
                M[k][i][j] = find_max(M[k - 1][i][j], M[k - 1][i][j + lg - 1], M[k - 1][i +lg - 1][j], M[k - 1][i + lg - 1][j + lg - 1]);
                                     ///N-V          ///N-E                   /// S-V                  /// S-E
            }
}

inline int query(int x, int y, int lg){

    int k = Log[lg]; /// impartim matricea in 4 matrice de lungime log2 (lg)
    int pow2 = 1 << k;

    return find_max(M[k][x][y], M[k][x][y + lg - pow2], M[k][x + lg - pow2][y], M[k][x + lg - pow2][y + lg - pow2]);

}


int main()
{
    int x, y, lg;

    fin>>n>>m;

    for(int i = 1; i <= n; i ++)
        for(int j = 1; j <= n; j ++)
            fin>>M[0][i][j];

    precalculare();

    for(int i = 1; i <= m; i ++){
        fin>>x>>y>>lg;
        fout<<query(x, y, lg)<<"\n";
    }

    return 0;
}