Pagini recente » Cod sursa (job #2874282) | Cod sursa (job #1108207) | Cod sursa (job #2104415) | Cod sursa (job #268299) | Cod sursa (job #3291352)
#include <bits/stdc++.h>
using namespace std;
int n, m; //dimensiunile plantatiei si numarul de intrebari
int rmq[18][500][500]; //rmq 2D
int lg[501]; //logaritmul in baza 2 al fiecarui numar de la 0 la n
void precalculare() //precalculeaza rmq si logaritmul
{
for(int i=1; i<=n; i++) //precalculam logaritmul
lg[i]=lg[i/2]+1;
for(int e=1; (1<<e)<n; e++) //precalculam rmq-ul
{
int putere=(1<<(e-1)); //puterea lui 2 de pe acel nivel
for(int i=0; i<n-putere; i++)
{
for(int j=0; j<n-putere; j++)
{
rmq[e][i][j]=max(max(rmq[e-1][i][j], rmq[e-1][i+putere][j]), max(rmq[e-1][i][j+putere], rmq[e-1][i+putere][j+putere])); //maximul pe submatricea cu coltul stanga-sus (i, j) si latura de lungime putere
}
}
}
}
int main()
{
ifstream cin("plantatie.in");
ofstream cout("plantatie.out");
cin >> n >> m;
for(int i=0; i<n; i++)
{
for(int j=0; j<n; j++) //citim numerele din matrice
cin >> rmq[0][i][j];
}
precalculare();
while(m--) //citim cele m intrebari
{
int i, j, k; //coltul stanga-sus si lungimea laturii
cin >> i >> j >> k;
int exponent=lg[k]; //logaritmul din baza 2 a lui k
int maxim=max(max(rmq[exponent][i][j], rmq[exponent][i+k-(1<<exponent)][j]), max(rmq[exponent][i][j+k-(1<<exponent)], rmq[exponent][i+k-(1<<exponent)][j+k-(1<<exponent)])); //maximul din submatricea data
cout << maxim << "\n"; //afisam maximul
}
return 0;
}