Cod sursa(job #2617246)

Utilizator stanciucalinStanciu Calin stanciucalin Data 21 mai 2020 11:28:48
Problema Plantatie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.72 kb
#include <iostream>
#include <fstream>
using namespace std;

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

int n, m;
int sparse_table[10][505][505];

int powers_of_2[31];

void powgen(){

    powers_of_2[0] = 1;

    for(int i = 1; i < 31; i++)
        powers_of_2[i] = 2 * powers_of_2[i - 1];
}

int get_log(int x){

    int s = 1, d = 31;

    while(s < d){

        int m = s + (d - s) / 2;

        if(powers_of_2[m] <= x){

            s = m + 1;
        }
        else{

            d = m;
        }
    }

    if(powers_of_2[d] == x)
        return d;

    return d - 1;
}

int maxim(int a, int b, int c, int d){

    return max(a, max(b, max(c, d)));
}

int main(){

    powgen();

    f>>n>>m;

    for(int i = 0; i < n; i++)
        for(int j = 0; j < n; j++){

            f>>sparse_table[0][i][j];
        }

    int maxp = get_log(n);

    for(int p = 1; p <= maxp; p++)
        for(int i = 0; i < n - (1 << p) + 1; i++)
            for(int j = 0; j < n - (1 << p) + 1; j++){

                sparse_table[p][i][j] = maxim(sparse_table[p - 1][i][j], sparse_table[p - 1][i + (1 << (p - 1))][j], sparse_table[p - 1][i][j + (1 << (p - 1))], sparse_table[p - 1][i + (1 << (p - 1))][j + (1 << (p - 1))]);
            }

    int x, y, k;
    int paux;

    for(int i = 0; i < m; i++){

        f>>x>>y>>k;

        x -= 1;     ///datorita identarii de la 0
        y -= 1;

        paux = get_log(k);

        g<<maxim(sparse_table[paux][x][y], sparse_table[paux][x + k - 1 - (1 << paux) + 1][y], sparse_table[paux][x][y + k - 1 - (1 << paux) + 1], sparse_table[paux][x + k - 1 - (1 << paux) + 1][y + k - 1 - (1 << paux) + 1])<<'\n';
    }

    return 0;
}