Cod sursa(job #534764)

Utilizator dushmiMihai-Alexandru Dusmanu dushmi Data 16 februarie 2011 10:23:30
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.29 kb
#include<cstdio>
#include<cmath>
#include<fstream>
using namespace std;
int logn,n,q,p2[20],putmax[502],dmax[502][502][10];
ifstream f("plantatie.in");
void read()
{
    freopen("plantatie.out","w",stdout);
    f>>n>>q;
    for(int i=1;i<=n;++i)
        for(int j=1;j<=n;++j)
            f>>dmax[i][j][0];
}
void init()
{
    logn=log2(n);
    p2[0]=1;
    for(int i=1;i<=logn;++i)
        p2[i]=p2[i-1]<<1;
}
inline int max(int x,int y)
{
    return x>y?x:y;
}
void dinam()
{
    for(int k=1;k<=logn;++k)
        for(int i=1;i+p2[k]-1<=n;++i)
            for(int j=1;j+p2[k]-1<=n;++j)
                dmax[i][j][k]=max(dmax[i][j][k-1],max(dmax[i+p2[k-1]][j][k-1],max(dmax[i][j+p2[k-1]][k-1],dmax[i+p2[k-1]][j+p2[k-1]][k-1])));
}
void pregen()
{
    int ind=0;
    for(int i=1;i<=n;i++)
    {
        if(p2[ind]==i)
            ind++;
        putmax[i]=ind-1;
    }
}
int rmq(int ii,int ij,int lung)
{
    int p=putmax[lung],fi=ii+lung-1,fj=ij+lung-1;
    return max(dmax[ii][ij][p],max(dmax[fi-p2[p]+1][ij][p],max(dmax[ii][fj-p2[p]+1][p],dmax[fi-p2[p]+1][fj-p2[p]+1][p])));
}
int main()
{
    int x,y,l;
    read();
    init();
    dinam();
    pregen();
    for(int i=1;i<=q;++i)
    {
        f>>x>>y>>l;
        printf("%d\n",rmq(x,y,l));
    }
    return 0;
}