Cod sursa(job #3229411)

Utilizator NeacsuMihaiNeacsu Mihai NeacsuMihai Data 15 mai 2024 22:07:35
Problema Plantatie Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.5 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][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][0] = v[i][j];
        }
    }

    for(int vertlog = 1; vertlog <= LOGMAX; vertlog++){
        for(int orilog = 1; orilog <= LOGMAX; orilog++){
            for(int i = 1; i + (1 << vertlog) - 1 <= N; i++){
                for(int j = 1; j + (1 << orilog) - 1 <= N; j++){
                    int x1 = i;
                    int y1 = j;
                    rmq[i][j][vertlog][orilog] = max4(
                                                    rmq[x1][y1][vertlog - 1][orilog - 1],
                                                    rmq[x1][y1 + (1 << (orilog-1))][vertlog - 1][orilog - 1],
                                                    rmq[x1 + (1 << (vertlog-1) )][y1][vertlog - 1][orilog - 1],
                                                    rmq[x1 + (1 << (vertlog-1) )][y1 + (1 << (orilog-1) )][vertlog - 1][orilog - 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 x2, int y2){
    int vertlog = putereDoiLowerbound(x2 - x1 + 1);
    int orilog = putereDoiLowerbound(y2 - y1 + 1);

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

}

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;

        int x2 = x1 + latura - 1;
        int y2 = y1 + latura - 1;

        fout << query(x1, y1, x2, y2) << "\n";
    }

}