Mai intai trebuie sa te autentifici.
Cod sursa(job #201072)
Utilizator | Data | 29 iulie 2008 00:09:07 | |
---|---|---|---|
Problema | Plantatie | Scor | 10 |
Compilator | cpp | Status | done |
Runda | Arhiva de probleme | Marime | 0.96 kb |
#include <cstdio>
#include <algorithm>
#define IN "plantatie.in"
#define OUT "plantatie.out"
#define FOR(i,a,b) for(int i=a;i<=b;++i)
#define N_MAX 1<<9
using namespace std;
int A[N_MAX][N_MAX][1<<4];
int N,M;
int lg[N_MAX],B[N_MAX];
void scan()
{
freopen(IN, "r",stdin);
freopen(OUT, "w",stdout);
scanf("%d%d", &N,&M);
FOR(i,1,N)
FOR(j,1,N)
scanf("%d", &A[i][j][0]);
}
void solve()
{
for(int k=1; (1<<k) <=N;++k)
for(int i=N;i>=1;--i)
for(int j=N;j>=1;--j)
A[i][j][k] = max( max(A[i][j][k-1],A[i+(1<<(k-1))][j][k-1]) , max(A[i][j+(1<<(k-1))][k-1],A[i+(1<<(k-1))][j+(1<<(k-1))][k-1]) );
FOR(i,1,N)
{
if(i % 2)
++lg[i];
lg[i] = lg[i-1];
}
while(M--)
{
int i,j,k,p;
scanf("%d%d%d\n",&i,&j,&k);
p = lg[k];
printf("%d\n", max( max(A[i][j][p], A[i][j+k-(1<<p)][p]), max(A[i+k-(1<<p)][j][p], A[i+k-(1<<p)][j+k-(1<<p)][p]) ) );
}
}
int main()
{
scan();
solve();
return 0;
}