Cod sursa(job #1876922)

Utilizator delta_wolfAndrei Stoica delta_wolf Data 12 februarie 2017 19:06:58
Problema Plantatie Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.21 kb
#include <cstdio>
#include<algorithm>
using namespace std;
int n,m,i,j,k,l;
int lg[503];
int a[20][503][20][503];

int q(int x1,int y1,int x2,int y2)
{
    int kx,ky,lenx=x2-x1+1,leny=y2-y1+1,m1,m2;
    kx=lg[lenx];
    ky=lg[leny];
    m1=max(a[kx][x1][ky][1],a[kx][x1][ky][y2+1-(1<<ky)]);
    m2=max(a[kx][x2+1-(1<<kx)][ky][y1],a[kx][x2+1-(1<<kx)][ky][y2+1-(1<<ky)]);
    return max(m1,m2);

}

int main()
{
    freopen("plantatie.in","r",stdin);
    freopen("plantatie.out","w",stdout);
    scanf("%d%d",&n,&m);
    for(i=0;i<n;i++)
        for(j=0;j<n;j++)
            scanf("%d",&a[0][i][0][j]);

    for (i=2;i<=500;i++)
        lg[i]=lg[i/2]+1;


    for(i=0;i<n;i++)
    {
        for(j=1;j<=lg[n];j++)
            for(k=0;k+(1<<(j-1))<n;k++)
            a[0][i][j][k]=max(a[0][i][j-1][k],a[0][i][j-1][k+(1<<(j-1))]);
    }


    for(i=1;i<=lg[n];i++)
        for(j=0;j<n;j++)
            for(k=0;k<=lg[n];k++)
                for(l=0;l<n;l++)
                    a[i][j][k][l]=max(a[i-1][j][k][l],a[i-1][j+(1<<(i-1)) ][k][l]);

    for(int xx,yy,kk;m;m--)
    {
        scanf("%d%d%d",&xx,&yy,&kk);
        printf("%d\n",q(xx-1,yy-1,xx+kk-2,yy+kk-2));
    }

    return 0;
}