Cod sursa(job #3229421)

Utilizator NeacsuMihaiNeacsu Mihai NeacsuMihai Data 15 mai 2024 22:33:00
Problema Plantatie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.14 kb
#include <bits/stdc++.h>

#define NMAX 500
#define LOGMAX 9

using namespace std;

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

int N, nrQ;
int v[NMAX + 1][NMAX + 1];
int rmq[NMAX + 1][NMAX + 1][LOGMAX + 1];

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

void buildRMQ(){
    for(int i = 1; i <= N; i++){
        for(int j = 1; j <= N; j++){
            rmq[i][j][0] = v[i][j];
        }
    }

        for(int log = 1; log <= LOGMAX; log++){
            for(int i = 1; i + (1 << log) - 1 <= N; i++){
                for(int j = 1; j + (1 << log) - 1 <= N; j++){
                    int x1 = i;
                    int y1 = j;
                    rmq[i][j][log] = max4(
                                        rmq[x1][y1][log - 1],
                                        rmq[x1][y1 + (1 << (log-1))][log - 1],
                                        rmq[x1 + (1 << (log-1) )][y1][log - 1],
                                        rmq[x1 + (1 << (log-1) )][y1 + (1 << (log-1) )][log - 1]
                                          );
                }
            }
        }

}

int putereDoiLowerbound(int x){
    int lo = -1;
    int hi = LOGMAX + 1;

    while(hi - lo > 1){
        int mid = lo + (hi - lo) / 2;

        if( (1 << mid) <= x ){
            lo = mid;
        }
        else {
            hi = mid;
        }
    }

    return lo;
}

int query(int x1, int y1, int latura){
    int log = putereDoiLowerbound(latura);
    int x2 = x1 + latura - 1;
    int y2 = y1 + latura - 1;

    return max4(
    rmq[x1][y1][log],
    rmq[x1][y2 - (1 << log) + 1][log],
    rmq[x2 - (1 << log) + 1][y1][log],
    rmq[x2 - (1 << log) + 1][y2 - (1 << log) + 1][log]
     );

}

int main()
{
    fin >> N >> nrQ;
    for(int i = 1; i <= N; i++){
        for(int j = 1; j <=  N; j++){
            fin >> v[i][j];
        }
    }
    buildRMQ();

    for(int q = 1; q <= nrQ; q++){
        int x1, y1;
        fin >> x1 >> y1;

        int latura;
        fin >> latura;


        fout << query(x1, y1, latura) << "\n";
    }
    return 0;
}