Cod sursa(job #1956159)

Utilizator RaZxKiDDavid Razvan RaZxKiD Data 6 aprilie 2017 15:50:20
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.17 kb
#include <iostream>
#include <fstream>

using namespace std;

ifstream in("plantatie.in");
ofstream out("plantatie.out");

int n,qs;
int RMQ[19][505][505];
int LOG2[505];

void read(){
    in>>n>>qs;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            in>>RMQ[0][i][j];
        }
    }
}
void logs(){
    for(int i=2;i<=n;i++){
        LOG2[i]=LOG2[i/2]+1;
    }
}
inline int maxi(int x, int y, int z, int a){
    return max(max(x,y),max(z,a));
}
void prep(){
    logs();
    for(int i=1;(1<<i)<=n;i++){
        for(int x=1;x<=n;x++){
            for(int y=1;y<=n;y++){
                RMQ[i][x][y]=maxi(RMQ[i-1][x][y],RMQ[i-1][x][y+(1<<(i-1))],RMQ[i-1][x+(1<<(i-1))][y],RMQ[i-1][x+(1<<(i-1))][y+(1<<(i-1))]);
            }
        }
    }
}
int query(int x, int y, int dim){
    int log_elem=LOG2[dim];
    int s=dim-(1<<log_elem);
    return maxi(RMQ[log_elem][x][y],RMQ[log_elem][x+s][y],RMQ[log_elem][x][y+s],RMQ[log_elem][x+s][y+s]);
}
void queries(){
    int x,y,k;
    for(int i=1;i<=qs;i++){
        in>>x>>y>>k;
        out<<query(x,y,k)<<"\n";
    }
}
int main(){
    read();
    prep();
    queries();
    return 0;
}