Cod sursa(job #1112000)

Utilizator TodeaDariustodea darius TodeaDarius Data 19 februarie 2014 12:27:23
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.2 kb
#include<cstdio>
using namespace std;
int n,m,v[10][505][505],p[505][505],ord,x,y,l,sol;
int log(int x)
{
    int nr,xx;
    xx=1;
    nr=0;
    while(xx*2<=x)
    {
        xx*=2;
        nr++;
    }
    return nr;
}
int maxim(int a,int b,int c,int d)
{
    int max;
    max=a;
    if(b>max) max=b;
    if(c>max) max=c;
    if(d>max) max=d;
    return max;
}
int main()
{
    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",&p[i][j]);
               v[0][i][j]=p[i][j];
           }
    ord=log(n);
    for(int i=1;i<=ord;i++)
        for(int j=1;j+(1<<i)-1<=n;j++)
            for(int k=1;k+(1<<i)-1<=n;k++)
            {
                v[i][j][k]=maxim(v[i-1][j][k],v[i-1][j][k+(1<<(i-1))],v[i-1][j+(1<<(i-1))][k],v[i-1][j+(1<<(i-1))][k+(1<<(i-1))]);
            }
    for(int q=1;q<=m;q++)
    {
        scanf("%d%d%d",&x,&y,&l);
        ord=log(l);
        sol=maxim(v[ord][x][y],v[ord][x][y+l-(1<<ord)],v[ord][x+l-(1<<ord)][y],v[ord][x+l-(1<<ord)][y+l-(1<<ord)]);
        printf("%d\n",sol);
    }
    return 0;
}