Cod sursa(job #676862)

Utilizator ioalexno1Alexandru Bunget ioalexno1 Data 9 februarie 2012 17:41:37
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.14 kb
#include <cstdio>
using namespace std;
const int nmax=505;
int a[nmax][nmax],m[10][nmax][nmax],lg[nmax],n;
inline int max(int x,int y)
{ if(x>y)return x; else return y; return 0; }
void rmq()
{ int i,j,k,nr,x,y;
for(i=1;i<=n;++i)
    for(j=1;j<=n;++j)
        m[0][i][j]=a[i][j];
lg[1]=0; for(i=2;i<=n;++i) lg[i]=lg[i>>1]+1;
for(k=1;(1<<k)<=n;++k)
    for(i=1;i<=n-(1<<k)+1;++i)
        for(j=1;j<=n-(1<<k)+1;++j)
            {
            nr=(1<<(k-1));
            x=max(m[k-1][i][j],m[k-1][i+nr][j]);
            y=max(m[k-1][i][j+nr],m[k-1][i+nr][j+nr]);
            m[k][i][j]=max(x,y);
            }
}
int main()
{ int i,x,y,k,mi,j,z,q,xf,yf;
freopen("plantatie.out","w",stdout);
freopen("plantatie.in","r",stdin); scanf("%d %d\n",&n,&mi);
for(i=1;i<=n;++i)
    for(j=1;j<=n;++j)
        scanf("%d ",&a[i][j]);
rmq();
for(i=1;i<=mi;++i)
    {
    scanf("%d %d %d\n",&x,&y,&k);
    xf=x+k-1; yf=y+k-1;
    z=max(m[lg[k]][x][y],m[lg[k]][x][yf-(1<<lg[k])+1]);
    q=max(m[lg[k]][xf-(1<<lg[k])+1][y],m[lg[k]][xf-(1<<lg[k])+1][yf-(1<<lg[k])+1]);
    printf("%d\n",max(z,q));
    }
fclose(stdin);
fclose(stdout);
return 0;
}