Pagini recente » Cod sursa (job #2280656) | Diferente pentru teorema-chineza-a-resturilor intre reviziile 89 si 36 | Cod sursa (job #1629064) | Cod sursa (job #993921) | Cod sursa (job #1045944)
#include <fstream>
#include <iostream>
#include <cmath>
using namespace std;
int a[11][501][501];
int main()
{
int i,j,n,m,lat,h,k,x,y,s,p,maxi;
ifstream f("plantatie.in");
ofstream g("plantatie.out");
f>>n>>m;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
f>>a[0][i][j];
p=1;
while((1<<p)<=n)
{
for(i=1;i<=n-(1<<p)+1;i++)
for(j=1;j<=n-(1<<p)+1;j++)
{
maxi=a[p-1][i][j];
if(a[p-1][i+(1<<(p-1))][j]>maxi)
maxi=a[p-1][i+(1<<(p-1))][j];
if(a[p-1][i+(1<<(p-1))][j+(1<<(p-1))]>maxi)
maxi=a[p-1][i+(1<<(p-1))][j+(1<<(p-1))];
if(a[p-1][i][j+(1<<(p-1))]>maxi)
maxi=a[p-1][i][j+(1<<(p-1))];
a[p][i][j]=maxi;
}
p++;
}
for(i=1;i<=m;i++)
{
f>>x>>y>>k;
lat=k;
h=(int)log2(k);
s=(1<<h);
if((1<<h)==k)
g<<a[h][x][y]<<'\n';
else
{
maxi=a[h][x][y];
k=k-(1<<h);
while(k>0)
{
h=(int)log2(k);
for(j=1;j<=lat-(1<<h)+1;j++)
{
if(a[h][x+j-1][y+s]>maxi)
maxi=a[h][x+j-1][y+s];
if(a[h][x+s][y+j-1]>maxi)
maxi=a[h][x+s][y+j-1];
}
s=s+(1<<h);
k=k-(1<<h);
}
g<<maxi<<'\n';
}
}
f.close();
g.close();
return 0;
}