Cod sursa(job #928647)

Utilizator PatrikStepan Patrik Patrik Data 26 martie 2013 16:39:34
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.3 kb
    #include<cstdio>
    #include<iostream>
    using namespace std;
    #define MAX 501
    int A[MAX][MAX][10] , N , M , log[MAX] , x , y , dim , k;

    void citire();
    void solve();
    int maxx(int a , int b , int c , int d);

    int main()
    {
        citire();
        solve();
        for(int i = 1 ; i <= M ; ++i )
        {
            scanf("%d%d%d" , &x , &y , &dim);
            k = log[dim];
            printf("%d\n" , max(max(A[x][y][k],A[x+dim-(1<<k)][y][k]),max(A[x][y+dim-(1<<k)][k],A[x+dim-(1<<k)][y+dim-(1<<k)][k])));
        }
        return 0;
    }

    void citire()
    {
        freopen("plantatie.in" , "r" , stdin );
        freopen("plantatie.out" , "w" , stdout);
        scanf("%d%d" , &N , &M);
        for( int i = 1 ; i <= N ; ++i )
            for( int j = 1 ; j <= N ; ++j )
                scanf("%d" , &A[i][j][0]);
    }

    void solve()
    {
        log[0] = 1;
        for(int i = 2 ; i <= N ; ++i )
            log[i] = log[i/2]+1;
        for(int k = 1 ; (1<<k)-1 < N ; ++k )
            for(int i = 1 ; i+(1<<k)-1 <= N ; ++i )
                for(int j = 1 ; j+(1<<k)-1 <= N ; ++j )
                    A[i][j][k] = max(max(A[i][j][k-1],A[i+(1<<(k-1))][j][k-1]),max(A[i][j+(1<<(k-1))][k-1],A[i+(1<<(k-1))][j+(1<<(k-1))][k-1]));
    }