Pagini recente » Cod sursa (job #2440204) | Cod sursa (job #1905557) | Cod sursa (job #3282118) | Cod sursa (job #2776632) | Cod sursa (job #2749364)
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("plantatie.in");
ofstream fout("plantatie.out");
int N, M, Log2[505],m[10][505][505];
//subprogram care calculeaza log2 din toate numerele de la 1 la N
void logaritm()
{
//Log2[0] = Log2[1] = 0;
for (int i = 2; i <= N; ++i)
Log2[i] = Log2[i/2] + 1;
}
//subprogram care returneaza maximul dintre 4 elemente
int maxim(int a, int b, int c, int d)
{
int m1, m2;
if(a > b)
m1 = a;
else
m1 = b;
if(c > d)
m2 = c;
else
m2 = d;
if(m1 > m2)
return m1;
else
return m2;
}
//subprogram pentru generarea matricei tridimensionale ce contine pe fiecare nivel i
//maximele pe suprafete patrate de latura 2^i din matricea de numere data
void sol()
{
for (int k=1; k <= Log2[N]; ++k)
for (int i=1; i + (1<<(k-1)) <= N; ++i)
for (int j=1; j + (1<<(k-1)) <= N; ++j)
{
int x = 1 << (k-1);
m[k][i][j] = maxim( m[k-1][i][j], m[k-1][i][j+x], m[k-1][i+x][j], m[k-1][i+x][j+x] );
//completam fiecare pozitie, din matricele de pe fiecare nivel, din matricea tridimensionala m,
//cu valoarea maxima dintre cele 4 subpatrate ale patratului actual(de latura 2^k si care are coltul stanga sus
// in coordonatele i si j)
}
}
int main()
{
fin >> N >> M;
//completam prima linie a matricei tridimensionale(linia 0) cu matricea data
// (minimele pe suprafete de forma a[i][j])
for (int i=1; i<=N; ++i)
for (int j=1; j<=N; ++j)
fin >> m[0][i][j];
//construim matricea tridimensionala m ce retine maximele me suprafete patratice
sol();
//interogam
for (int i=1; i <= M; ++i)
{
//citim coordonatele(x = linia/coordonata pe Oy si y = coloana/coordonata pe Ox) coltului
// din stanga sus ale patratului ce urmeaza sa fie interogat
//si dimensiunea laturii acestuia(l)
int x, y, l, z;
fin >> x >> y >> l;
//z primeste valoarea log2 din lungimea laturii patratului citit (ne pozitionam pe nivelul
//potrivita in matricea tridimensionala m)
z = Log2[l];
//afisam cea mai mare valoare dintre maximele celor 4 subpatrate
//ale patratului actual(de latura l si cu coltul stanga sus in coorodnatele x si y),
//patrate ce sunt incluse in patratul actual si il acopera in intregime
int ydr = y+l; //coordonata y a coltului din stanga sus al urmatorului patrat(mai la dreapta pe axa Ox cu l fata de coltul patratului actual),
// din care vom scadea 2^z ca sa nu iesim din suprafata
int xjos = x+l; //coordonata x a coltului din stanga sus al urmatorului patrat(mai jos pe axa Oy cu l fata de coltul patratului actual),
// din care vom scadea 2^z ca sa nu iesim din suprafata
fout << maxim (m[z][x][y], m[z][x][ydr - (1 << z)], m[z][xjos - (1 << z)][y], m[z][xjos - (1 << z)][ydr - (1 << z)]) << "\n";
}
return 0;
}