Pagini recente » Cod sursa (job #1170257) | Cod sursa (job #858890) | Cod sursa (job #1556171) | Cod sursa (job #2163849) | Cod sursa (job #805868)
Cod sursa(job #805868)
#include <iostream>
#include <fstream>
#define NMAX 510
using namespace std;
int N, M;
int a[NMAX][NMAX], log[NMAX];
int rmq[NMAX << 1][NMAX << 1][10];
inline int MAX(int a, int b, int c, int d)
{
int ret = 0;
if (ret < a) ret = a;
if (ret < b) ret = b;
if (ret < c) ret = c;
if (ret < d) ret = d;
return ret;
}
void DEBUGmat(int l)
{
for (int i = 1; i <= N; ++i)
{
for (int j = 1; j <= N; ++j)
{
cout << rmq[i][j][l] << ' ';
}
cout << '\n';
}
}
inline void maker(int i, int j, int cnt)
{
int tnc = cnt - 1;
rmq[i][j][cnt] = MAX(
rmq[i][j][tnc],
rmq[i][j + (1 << tnc)][tnc],
rmq[i + (1 << tnc)][j][tnc],
rmq[i + (1 << tnc)][j + (1 << tnc)][tnc]);
}
inline int query(int i, int j, int k)
{
int vega = 1 << log[k];
return MAX(rmq[i][j][log[k]], rmq[i][j + k - vega][log[k]], rmq[i + k - vega][j][log[k]], rmq[i + k - vega][j + k - vega][log[k]]);
}
int main()
{
ifstream fin("plantatie.in");
ofstream fout("plantatie.out");
fin >> N >> M;
for (int i = 1; i <= N; ++i)
{
for (int j = 1; j <= N; ++j)
{
fin >> a[i][j];
}
}
log[1] = 0;
for (int i = 2, p = 2; i < NMAX; ++i)
{
log[i] = log[i - 1];
if (i == p)
{
++log[i];
p <<= 1;
}
}
for (int i = 1; i <= N; ++i)
{
for (int j = 1; j <= N; ++j)
{
rmq[i][j][0] = a[i][j];
}
}
for (int k = 1; k <= 9; ++k)
{
if (!((1 << k) <= N)) break;
for (int i = 1; i <= N; ++i)
{
for (int j = 1; j <= N; ++j)
{
maker(i, j, k);
}
}
}
for (int i = 1; i <= M; ++i)
{
int l, c, n;
fin >> l >> c >> n;
fout << query(l, c, n) << '\n';
}
fout.close();
return 0;
}