Pagini recente » Cod sursa (job #1211475) | Cod sursa (job #784120) | Cod sursa (job #693323) | Cod sursa (job #623513) | Cod sursa (job #931954)
Cod sursa(job #931954)
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <set>
#include <queue>
#include <deque>
using namespace std;
ifstream f("plantatie.in");
ofstream g("plantatie.out");
#define nmax 501
#define Logmax 10
#define ll long long
int n, m, a[nmax][nmax], rmq[Logmax][nmax][nmax], Log[nmax];
void citeste(){
f >> n >> m;
for(int i=1; i<=n; ++i){
for(int j=1; j<=n; ++j) f >> a[i][j];
}
}
void rezolva(){
// rmq 2D rmq[k][i][j] = maximul din patratul cu coltul stanga - sus in (i,j) si latura k
for(int i=1; i<=n; ++i)
for(int j=1; j<=n; ++j){
rmq[0][i][j] = a[i][j];
}
for(int k=1; k<Logmax; ++k){
for(int i=1; i+(1<<k)-1<=n; ++i){
for(int j=1; j+(1<<k)-1 <= n; ++j){
rmq[k][i][j] = rmq[k-1][i][j];
int newI = i + (1<<(k-1));
rmq[k][i][j] = max(rmq[k][i][j], rmq[k-1][newI][j]);
int newJ = j + (1<<(k-1));
rmq[k][i][j] = max(rmq[k][i][j], rmq[k-1][i][newJ]);
rmq[k][i][j] = max(rmq[k][i][j], rmq[k-1][newI][newJ]);
}
}
}
for(int i=2; i<=n; ++i) Log[i] = Log[i/2] + 1;
int sus, st, k;
for(int i=1; i<=m; ++i){
f >> sus >> st >> k;
int put = Log[k];
int Max = rmq[put][sus][st];
int dr = st + k - 1; int jos = sus + k - 1;
int newSt = dr - (1<<put) + 1;
Max = max(Max, rmq[put][sus][newSt]);
int newSus = jos - (1<<put) + 1;
Max = max(Max, rmq[put][newSus][st]);
Max = max(Max, rmq[put][newSus][newSt]);
//cout << Max << "\n";
g << Max << "\n";
}
}
int main(){
citeste();
rezolva();
f.close();
g.close();
return 0;
}