Cod sursa(job #2229519)

Utilizator tanasaradutanasaradu tanasaradu Data 7 august 2018 01:12:57
Problema Plantatie Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.43 kb
#include <bits/stdc++.h>

using namespace std;

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

const short NMAX = 505;

int rmq[NMAX][NMAX][15] , a[NMAX][NMAX] , n , query , lg2[NMAX];

int main()
{

    ///rmq[i][j][k] - > elementul maxim din submatricea (i , j) (i + 2 ^ k - 1 , j + 2 ^ k - 1)
    int p , x , y , k;
    fin >> n >> query;
    for(int i = 1 ; i <= n ; i++)
        for(int j = 1 ; j <= n ; j++)
            fin >> rmq[i][j][0];
    lg2[1] = 0;
    for(int i = 2 ; i <= n ; i++)
        lg2[i] = lg2[i / 2] + 1;
    for(int k = 1 ; k <= lg2[n] ; k++)
        for(int i = 1 ; i <= n - (1 << (k - 1)) ; i++)
            for(int j = 1 ; j <= n - (1 << (k - 1)) ; j++)
                /// impartim patratul mare in 4 patrate mici fiecare avand latura 2 ^ (k - 1)
            {
                p = (1 << (k - 1));
                rmq[i][j][k] = max({rmq[i][j][k] , rmq[i][j][k - 1] , rmq[i][j + p][k - 1] , rmq[i + p][j][k - 1] , rmq[i + p][j + p][k - 1]});
            }
    while(query--)
    {
        fin >> x >> y >> k;
        fout << max({rmq[x][y][lg2[y - x + 1]] , rmq[x + k - 1 - (1 << lg2[y - x + 1]) + 1][y][lg2[y - x + 1]] ,
                     rmq[x][y + k - 1 - (1 << lg2[y - x + 1]) + 1][lg2[y - x + 1]] , rmq[x + k - 1 - (1 << lg2[y - x + 1]) + 1][y + k - 1 - (1 << lg2[y - x + 1]) + 1][lg2[y - x + 1]]}) << "\n";
    }
    fin.close();
    fout.close();
    return 0;
}