Pagini recente » Istoria paginii runda/wrtyer | Cod sursa (job #397298) | Cod sursa (job #1183165) | Cod sursa (job #117356) | Cod sursa (job #1723599)
#include <bits/stdc++.h>
using namespace std;
const int NMAX = 505;
int n;
int rmq[10][NMAX][NMAX],
lg[NMAX];
inline void build_rmq(void) {
for(int i=2; i<=n; ++i)
lg[i] = lg[i-1] + int(!(i&i-1));
for(int k=1; k<=lg[n]; ++k) {
for(int i=1; i<=n-(1<<k-1); ++i) {
for(int j=1; j<=n-(1<<k-1); ++j) {
if(rmq[k][i][j] < rmq[k-1][i][j])
rmq[k][i][j] = rmq[k-1][i][j];
if(rmq[k][i][j] < rmq[k-1][i][j+(1<<k-1)])
rmq[k][i][j] = rmq[k-1][i][j+(1<<k-1)];
if(rmq[k][i][j] < rmq[k-1][i+(1<<k-1)][j])
rmq[k][i][j] = rmq[k-1][i+(1<<k-1)][j];
if(rmq[k][i][j] < rmq[k-1][i+(1<<k-1)][j+(1<<k-1)])
rmq[k][i][j] = rmq[k-1][i+(1<<k-1)][j+(1<<k-1)];
}}}
}
inline int qrmq(int x, int y, int l) {
int ans = 0;
if(ans < rmq[lg[l]][x][y])
ans = rmq[lg[l]][x][y];
if(ans < rmq[lg[l]][x+l-(1<<lg[l])][y])
ans = rmq[lg[l]][x+l-(1<<lg[l])][y];
if(ans < rmq[lg[l]][x][y+l-(1<<lg[l])])
ans = rmq[lg[l]][x][y+l-(1<<lg[l])];
if(ans < rmq[lg[l]][x+l-(1<<lg[l])][y+l-(1<<lg[l])])
ans = rmq[lg[l]][x+l-(1<<lg[l])][y+l-(1<<lg[l])];
return ans;
}
int main(void) {
freopen("plantatie.in", "r", stdin);
freopen("plantatie.out", "w", stdout);
int m, x, y, l;
scanf("%d%d",&n,&m);
for(int i=1; i<=n; ++i)
for(int j=1; j<=n; ++j)
scanf("%d",&rmq[0][i][j]);
build_rmq();
while(m--) {
scanf("%d%d%d",&x,&y,&l);
printf("%d\n",qrmq(x, y, l));
}
fclose(stdin);
fclose(stdout);
return 0;
}