Pagini recente » Cod sursa (job #2640718) | Cod sursa (job #490447) | Cod sursa (job #1543133) | Solutii ONIS 2014, Runda 3 | Cod sursa (job #1960749)
#include <iostream>
#include <fstream>
#define NMAX 505
#define LOG 12
using namespace std;
ifstream in("plantatie.in");
ofstream out("plantatie.out");
int d[LOG][LOG][NMAX][NMAX], a[NMAX][NMAX],logn,n,m;
int log(int n)
{
int i;
for(i=0;(1<<i)<=n;i++);
return i;
}
int maxim(int a,int b,int c,int d)
{
return max(c,max(max(a,b),d));
}
void rmq()
{
logn = log(n);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
d[0][0][i][j] = a[i][j];
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
d[0][1][i][j] = max(a[i][j],a[i][j+1]);
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
d[1][0][i][j] = max(a[i+1][j],a[i][j]);
}
}
for(int i=1;i<=logn;i++)
{
for(int j=1;j<=logn;j++)
{
for(int x=1;x<=n-(1<<i)+1;x++)
{
for(int y=1;y<=n-(1<<j)+1;y++)
{
d[i][j][x][y] = maxim(
d[i-1][j-1][x][y],d[i-1][j-1][x+(1<<(i-1))][y+(1<<(j-1))],
d[i-1][j-1][x+(1<<(i-1))][y],d[i-1][j-1][x][y+(1<<(j-1))]);
}
}
}
}
}
int rez(int x,int y, int k)
{
int lgk = log(k)-1;
return maxim(
d[lgk][lgk][x][y], d[lgk][lgk][x+k-(1<<lgk)][y+k-(1<<lgk)],
d[lgk][lgk][x+k-(1<<lgk)][y], d[lgk][lgk][x][y+k-(1<<lgk)]
);
}
int main()
{
in >> n >> m;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
in >> a[i][j];
}
}
rmq();
int a,b,k;
for(int i=0;i<m;i++)
{
in >> a >> b >> k;
out << rez(a,b,k) << "\n";
}
return 0;
}