Pagini recente » Cod sursa (job #1407010) | Cod sursa (job #2609445) | Cod sursa (job #434903) | Cod sursa (job #1407424) | Cod sursa (job #2755195)
#include<bits/stdc++.h>
using namespace std;
ifstream fin("plantatie.in");
ofstream fout("plantatie.out");
int n, m, a[20][501][501];
//a[l][i][j] --> maximmul unui patrat cu coltul stanga sus in x, y si cu o latura de 2^l
int maxim(int a, int b, int c, int d)
{
return max(max(a, b), max(c, d));
}
void initializare()
{
//RMQ 3D
int i, j, p, l; //p = 2^l
for(l = 1, p = 2; p <= n; ++l, p *= 2) //nu are sens sa calculeazaulam pt patrate mai mari decat l plantatie
for(i = 0; i < n; ++i)
for(j = 0; j < n; ++j)
a[l][i][j] = maxim(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]);
//impartim in 4 patratele si facem maximmul dintre ele
}
int calculeaza(int x, int y, int lg)
{
int pow = 1, l = 0; //cautam cea mai mare putere a lui 2 apropiata de lg
while(pow*2 < lg)
{
pow *= 2;
l++; //exponentul puterii
}
//sarim peste o bucata de interval(matrice) fiind maximul de intervale prin care se pot intrepatrunde matricele
return maxim(a[l][x][y], a[l][x][y + lg - pow],a[l][x + lg - pow][y], a[l][x + lg - pow][y + lg - pow]); //4 subpatrate cu latura de 2^l
}
int main()
{
int x, y, i, j, k, lg;
fin >> n >> m;
for(i = 0; i < 20; ++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 maximmul
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 << calculeaza(x-1, y-1, lg) << "\n";///indexare de la 0
}
}