Cod sursa(job #1487442)

Utilizator otto1Palaga Vicentiu-Octavian otto1 Data 16 septembrie 2015 20:48:17
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.24 kb
#include <cstdio>
#include <cmath>
int n,m,p;
int rmq[523][523][10],a[523][523];
int maxim(int a,int b,int c,int d)
{
    int m=0;
    if(a>m) m=a;
    if(b>m) m=b;
    if(c>m) m=c;
    if(d>m) m=d;
    return m;
}
int main()
{
    freopen ("plantatie.in","r",stdin);
    freopen ("plantatie.out","w",stdout);
    scanf("%d%d",&n,&m);
    p=(int)log2(n);
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
        {
            scanf("%d",&a[i][j]);
        }
    }
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
        {
            rmq[i][j][0]=a[i][j];
        }
    }
    for(int k=1;k<=p;k++)
    {
        int pt=(1<<(k-1));
        int lim=n-pt+1;
        for(int i=1;i<=lim;i++)
        {
            for(int j=1;j<=lim;j++)
            {
                rmq[i][j][k]=maxim(rmq[i][j][k-1],rmq[i+pt][j+pt][k-1],rmq[i+pt][j][k-1],rmq[i][j+pt][k-1]);
            }
        }
    }
    int p1,p2,latura;
    for(int i=1;i<=m;i++)
    {
        scanf("%d%d%d",&p1,&p2,&latura);
        int lgt=(int)log2(latura);
        printf("%d\n",maxim(rmq[p1][p2][lgt],rmq[p1+latura-(1<<lgt)][p2][lgt],rmq[p1][p2+latura-(1<<lgt)][lgt],rmq[p1+latura-(1<<lgt)][p2+latura-(1<<lgt)][lgt]));
    }
}