Cod sursa(job #1042776)

Utilizator marius135Dumitran Adrian Marius marius135 Data 27 noiembrie 2013 17:52:39
Problema Plantatie Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.46 kb
#include<cstdio>
#include<iostream>
 
using namespace std;
#define maxn 501
 
int mat[maxn][maxn], putere[maxn];
int RMQ[10][maxn][maxn];
 
int main() {
 
    freopen("plantatie.in", "r", stdin);
    freopen("plantatie.out", "w", stdout);
    int n, q;
    cin>>n>>q;
    for( int i = 0; i < n; ++i) {
        for( int j = 0; j < n; ++j)
            scanf("%d", &RMQ[0][i][j]);
    }
    for( int l = 1; (1<<l) <= n; ++l)
        for( int i = 0; i < n; ++i)
            for( int j = 0; j < n; ++j) {
                RMQ[l][i][j] = RMQ[l-1][i][j];
                int power = ( 1<<(l-1));
                if( i + power < n) {
                    RMQ[l][i][j] = max(RMQ[l][i][j], RMQ[l-1][ i + power][j]);
                    if( j + power < n)
                        RMQ[l][i][j] = max( RMQ[l][i][j], max( RMQ[l-1][i][j + power], RMQ[l-1][i+power][j+power]));
                }
            }
    putere[1] = 0;
    for( int i = 2; i <= 500; ++i) {
        putere[i] = putere[i-1] + !(i &(i-1));
    //  cout<<i<<" "<<putere[i]<<endl;
    }
 
    while(q) {
        int x,y,l;
        scanf("%d %d %d", &x,&y,&l);
        x--; y--;
        int max_pow = putere[l];
        int power = ( 1<< max_pow);
         
        int rez =  max( RMQ[max_pow][x][y], RMQ[max_pow][x][y+l-power]);
        rez = max ( rez, max( RMQ[max_pow][ x+l- power][y], RMQ[max_pow][x+l-power][y+l-power]));
        cout<<rez<<endl;
         
        q--;
    }
    return 0;
}