Cod sursa(job #1410163)

Utilizator alex_HarryBabalau Alexandru alex_Harry Data 30 martie 2015 21:47:57
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.36 kb
#include <fstream>
using namespace std;
ifstream f("plantatie.in");
ofstream g("plantatie.out");
const int NMax = 505;
int N,M,Matrix[NMax][NMax];
int RMQ[NMax][NMax][13];
int Log[NMax];
void Read()
{
    f>>N>>M;
    for(int i=1;i<=N;i++)
        for(int j=1;j<=N;j++)
            f>>Matrix[i][j],RMQ[i][j][0]=Matrix[i][j];
}
void precalcLog()
{
    for(int i=2;i<=N;i++)
        Log[i]=Log[i/2]+1;
}
void precalcRMQ()
{
    for(int i=1;(1<<i)<=N;i++)
    {
        for(int line=1;line<=N-(1<<i)+1;line++)
            for(int col=1;col<=N-(1<<i)+1;col++)
            {
                int Max=RMQ[line][col][i-1];
                Max=max(Max,RMQ[line+(1<<(i-1))][col][i-1]);
                Max=max(Max,RMQ[line+(1<<(i-1))][col+(1<<(i-1))][i-1]);
                Max=max(Max,RMQ[line][col+(1<<(i-1))][i-1]);
                RMQ[line][col][i]=Max;
            }
    }
}

int countRMQ(int x,int y,int k)
{
    int diff=Log[k];
    int ans=0;
    ans=max(ans,RMQ[x][y][diff]);
    ans=max(ans,RMQ[x+k-(1<<diff)][y][diff]);
    ans=max(ans,RMQ[x][y+k-(1<<diff)][diff]);
    ans=max(ans,RMQ[x+k-(1<<diff)][y+k-(1<<diff)][diff]);
    return ans;
}
int main()
{
    Read();
    precalcLog();
    precalcRMQ();
    for(int i=1;i<=M;i++)
    {
        int x,y,k;
        f>>x>>y>>k;
        g<<countRMQ(x,y,k)<<"\n";
    }
    return 0;
}