Pagini recente » Cod sursa (job #88669) | Cod sursa (job #108888) | Cod sursa (job #3261047) | Cod sursa (job #18180)
Cod sursa(job #18180)
#include<fstream.h>
int long max[501][501][10],n,a[501][501];
void init_max()
{int long i,k,j,jj;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
max[i][j][0]=a[i][j];
for(i=1;(1<<i)<=n;i++)
for(j=1;j<=n;j++)
for(jj=1;jj<=n;jj++)
{max[j][jj][i]=max[j][jj][i-1];
if(max[j][jj+(1<<(i-1))][i-1]>max[j][jj][i])
max[j][jj][i]=max[j][jj+(1<<(i-1))][i-1];
if(max[j][jj][i]<max[j+(1<<(i-1))][jj][i-1])
max[j][jj][i]=max[j+(1<<(i-1))][jj][i-1];
if(max[j][jj][i]<max[j+(1<<(i-1))][jj+(1<<(i-1))][i-1])
max[j][jj][i]=max[j+(1<<(i-1))][jj+(1<<(i-1))][i-1];
}
}
int long rezolva(int long x,int long y,int long z,int long zz)
{int long i,j,maxim;
if((!z)||(!zz))
return -1;
if(z>=zz)
{for(i=15;i>=0;i--)
if((1<<i)&zz)
{maxim=rezolva(x,y+(1<<i),z,zz-(1<<i));
for(j=0;j<z/(1<<i);j++)
if(maxim<max[x+j*(1<<i)][y][i])
maxim=max[x+j*(1<<i)][y][i];
if(maxim<rezolva(j*(1<<i),y,z%(1<<i),1<<i))
maxim=rezolva(j*(1<<i),y,z%(1<<i),1<<i);
return maxim;
}
}
else
{for(i=15;i>=0;i--)
if((1<<i)&z)
{maxim=rezolva(x+(1<<i),y,z-(1<<i),zz);
for(j=0;j<zz/(1<<i);j++)
if(maxim<max[x][y+j*(1<<i)][i])
maxim=max[x][y+j*(1<<i)][i];
if(maxim<rezolva(x,y+j*(1<<i),1<<i,zz%(1<<i)))
maxim=rezolva(x,y+j*(1<<i),1<<i,zz%(1<<i));
return maxim;
}
}
}
int main()
{ifstream f("plantatie.in");
int long m,i,j,x,y,z;
f>>n>>m;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
f>>a[i][j];
init_max();
ofstream g("plantatie.out");
for(i=1;i<=m;i++)
{f>>x>>y>>z;
g<<rezolva(x,y,z,z)<<"\n";
}
g.close();
return 0;
}