Mai intai trebuie sa te autentifici.
Cod sursa(job #2001684)
Utilizator | Data | 17 iulie 2017 14:58:26 | |
---|---|---|---|
Problema | Plantatie | Scor | 10 |
Compilator | cpp | Status | done |
Runda | Arhiva de probleme | Marime | 1 kb |
#include <bits/stdc++.h>
using namespace std;
ifstream fin("plantatie.in");
ofstream fout("plantatie.out");
int n, m, rmq[510][510][11], lg[510];
void precalculare()
{
for(int i=2;i<=n; i++)
lg[i] = lg[i/2] + 1;
for(int k=1; (1<<k) <= n; k++)
for(int i=1; i<=n-(1<<k)+1; i++)
for(int j=1; j<=n-(1<<k)+1; j++)
rmq[i][j][k] = max(max(rmq[i][j][k-1], rmq[i+(1<<(k-1))][j][k-1]), max(rmq[i][j+1<<(k-1)][k-1], rmq[i+(1<<(k-1))][j+(1<<(k-1))][k-1]));
}
int query(int x, int y, int d)
{
int ln = lg[d];
int sol = max(max(rmq[x][y][ln], rmq[x+d-(1<<ln)][y][ln]), max(rmq[x][y+d-(1<<ln)][ln],rmq[x+d-(1<<ln)][y+d-(1<<ln)][ln]));
return sol;
}
int main()
{
int x, y, c;
fin >> n>> m;
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++)
fin >> rmq[i][j][0];
precalculare();
for(int i=1; i<=m; i++)
{
fin >> x >> y >> c;
fout<<query(x, y, c)<<'\n';
}
return 0;
}