Cod sursa(job #1133661)

Utilizator heracleRadu Muntean heracle Data 5 martie 2014 12:03:37
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.35 kb
#include <cstdio>

const int Q=501;

int n,t;

int v[Q][Q];

int rmq[9][Q][Q],log[Q];

int max(int a, int b)
{
    return a>b?a:b;
}
int max(int a, int b, int c, int d)
{
    return max(a,b) > max(c,d) ? max(a,b) : max(c,d);
}


void make_rmq()
{
    for(int i=2; i<=n; i++)
        log[i]=log[i/2]+1;

    for(int k=1; k<=log[n]; k++)
    {
        for(int i=1; i<=n-(1<<k)+1; i++)
        {
            for(int j=1; j<=n-(1<<k)+1; j++)
            {
                rmq[k][i][j]=max(rmq[k-1][i][j],rmq[k-1][i+(1<<(k-1))][j],rmq[k-1][i][j+(1<<(k-1))],rmq[k-1][i+(1<<(k-1))][j+(1<<(k-1))]);
            }
        }
    }

}

int main()
{
    freopen("plantatie.in","r",stdin);
    freopen("plantatie.out","w",stdout);

    scanf("%d %d\n",&n,&t);

    for(int i=1; i<=n; i++)
    {
        for(int j=1; j<=n; j++)
        {
            scanf("%d",&v[i][j]);
            rmq[0][i][j]=v[i][j];
        }
    }

    make_rmq();

    int a,b,k,lg;

    for(int i=1; i<=t; i++)
    {
        scanf("%d %d %d\n",&a,&b,&k);
        lg=log[k];

        printf("%d\n",max(rmq[lg][a][b],rmq[lg][a+k-(1<<lg)][b],rmq[lg][a][b+k-(1<<lg)],rmq[lg][a+k-(1<<lg)][b+k-(1<<lg)]));

    }
    //return min(rmq[lg][sx][sy], rmq[lg][sx][fy-(1<<lg)+1], rmq[lg][fx-(1<<lg)+1][sy],rmq[lg][fx-(1<<lg)+1][fy- (1<<lg)+1]);

    return 0;
}