Cod sursa(job #534757)

Utilizator dushmiMihai-Alexandru Dusmanu dushmi Data 16 februarie 2011 10:16:15
Problema Plantatie Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.27 kb
#include<cstdio>
#include<cmath>
#include<fstream>
using namespace std;
int logn,n,q,p2[20],dmax[505][505][20];
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])));
}
int cautb(int val)
{
    int i=0,pas=1<<4;
    for(i=0;pas;pas>>=1)
        if(i+pas<=logn && p2[i+pas]<=val)
            i+=pas;
    return i;
}
int rmq(int ii,int ij,int lung)
{
    int p=cautb(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();
    for(int i=1;i<=q;i++)
    {
        f>>x>>y>>l;
        printf("%d\n",rmq(x,y,l));
    }
    return 0;
}