Pagini recente » Cod sursa (job #1049128) | Cod sursa (job #1906292) | Cod sursa (job #639310) | Cod sursa (job #1224622) | Cod sursa (job #3311303)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("plantatie.in");
ofstream fout("plantatie.out");
vector<vector<int> > v;
const int LOGMAX=10;
struct rmq{
vector<vector<vector<int> > > mat;
vector<int> lg;
rmq(vector<vector<int> >& v,int n)
:mat(LOGMAX+2, vector<vector<int> >(n+1,vector<int>(n+1))), lg(n+1)
{
build_log(n);
build_rmq(v,n);
}
void build_log(int n){
lg[1]=0;
for(int i=2;i<=n;i++){
lg[i]=lg[i/2]+1;
}
}
void build_rmq(vector<vector<int> >& v, int n){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
mat[0][i][j]=v[i][j];
}
}
for(int k=1;k<=lg[n];k++){
for(int i=1;i+(1<<k)-1<=n;i++){
for(int j=1;j+(1<<k)-1<=n;j++){
mat[k][i][j]=max(max(mat[k-1][i][j],mat[k-1][i][j+(1<<(k-1))]),max(mat[k-1][i+(1<<(k-1))][j],mat[k-1][i+(1<<(k-1))][j+(1<<(k-1))]));
}
}
}
}
int query(int i, int j, int k){
int dist=lg[k];
//cout<<mat[dist][i][j]<<' '<<mat[dist][i][j+(1<<(dist))]<<' '<<i+(1<<(dist))<<' '<<j;
return max(max(mat[dist][i][j],mat[dist][i][j+k-(1<<(dist))]),max(mat[dist][i+k-(1<<(dist))][j],mat[dist][i+k-(1<<(dist))][j+k-(1<<(dist))]));
}
};
int main(){
int n, q;
fin>>n>>q;
v.resize(n+1);
for(int i=1;i<=n;i++){
v[i].resize(n+1);
for(int j=1;j<=n;j++){
fin>>v[i][j];
}
}
rmq ans(v, n);
for(int i=1;i<=q;i++){
int x, y, k;
fin>>x>>y>>k;
fout<<ans.query(x, y, k)<<'\n';
}
}