Pagini recente » Cod sursa (job #645026) | Cod sursa (job #1081236) | Cod sursa (job #549960) | Cod sursa (job #526860) | Cod sursa (job #2753720)
#include<bits/stdc++.h>
using namespace std;
ifstream fin("plantatie.in");
ofstream fout("plantatie.out");
int n, m;
int a[18][503][503]; ///a[l][i][j] --> maximul unui patrat cu coltul stanga sus in x, y si cu o latura de 2^l
int maxi(int a, int b, int c, int d)
{
return max(max(a, b), max(c, d));
}
///RMQ 3D
void initializare()
{
int i, j, p, l; ///2^l = p
for(l = 1, p = 2; p <= n; ++l, p *= 2)///p <= n --> nu are rost sa calculam pt patrate care sunt mai mari decat l plantatie
for(i = 0; i < n; ++i)
for(j = 0; j < n; ++j)
a[l][i][j] = maxi(a[l-1][i][j], a[l-1][i][j + p/2],a[l-1][i + p/2][j], a[l-1][i + p/2][j + p/2]);
///spargem patratul in 4 patratele --> facem maximul dintre ele
}
int calc(int x, int y, int lg)
{
///cautam cea mai mare putere a lui 2 apropiata de lg
int pow = 1, l = 0;
while(pow*2 < lg)
{
pow *= 2;
l++; ///exponentul puterii de 2
}
///acum stim ca putem sa sarim: peste o bucata de interval(matrice)
///fiind maxim de intervale se pot intrepatrunde matricele
return maxi(a[l][x][y], a[l][x][y + lg - pow],a[l][x + lg - pow][y], a[l][x + lg - pow][y + lg - pow]); ///tot de cele 4 matrici ---> cu latura de 2^l
}
int main()
{
int x, y, i, j, k, lg;
fin >> n >> m;
///initializam matriea de max
for(i = 0; i < 17; ++i)
for(j = 0; j < 500; ++j)
for(k = 0; k < 500; ++k)
a[i][j][k] = -1; //o valoare foarte mica nu va influenta maximul
for( i = 0; i < n; ++i)
for(j = 0; j < n; ++j)
fin >> a[0][i][j]; //prima linie e matricea
initializare();
for( i = 1; i <= m; ++i)
{
fin >> x >> y >> lg;
fout << calc(x-1, y-1, lg) << "\n";///indexare de la 0
}
}