Cod sursa(job #1446304)

Utilizator radu_cebotariRadu Cebotari radu_cebotari Data 1 iunie 2015 13:20:40
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.07 kb
#include<fstream>
using namespace std;
ifstream in("plantatie.in");
ofstream out("plantatie.out");
const int NMAX = 505;
const int LMAX = 10;

int R[NMAX][NMAX][LMAX],n,m,lg[NMAX];

void read()
{

    in>>n>>m;
    int x;
    for(int i = 1 ; i <= n ; ++i)
        for(int j = 1 ; j <= n ; ++j){
            in>>x;
            R[i][j][0] = x;
        }
}

void RMQ()
{

    lg[1] = 0;
    for(int i = 2 ; i <= n ; ++i)
        lg[i] = lg[i/2] + 1;
    for(int k = 1 ; k <= lg[n] ; ++k)
        for(int i = 1 ; n - (1 << k) + 1 >= i ; ++i )
            for(int j = 1 ; n - (1 << k) + 1 >= j ; ++j)
                R[i][j][k] = max(max(R[i][j][k-1],R[i + (1 << (k-1))][j][k-1]),max(R[i][j + (1 << (k-1))][k-1],R[i + (1 << (k-1))][j + (1 << (k-1))][k-1]));


}

int solve(int x,int y,int k)
{

    int len = lg[k];
    int dif = k - (1 << len);
    return max(max(R[x][y][len],R[x + dif][y + dif][len]),max(R[x+dif][y][len],R[x][y + dif][len]));
}

int main()
{

    read();
    RMQ();
    int a,b,c;
    for( ; m ; --m){
        in>>a>>b>>c;
        out<<solve(a,b,c)<<"\n";
    }
    return 0;
}