Cod sursa(job #1956149)

Utilizator RaZxKiDDavid Razvan RaZxKiD Data 6 aprilie 2017 15:41:51
Problema Plantatie Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.22 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*500];

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 max(int x, int y, int z, int a){
    return (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]=max(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;
    log_elem=LOG2[dim];
    return max(RMQ[log_elem][x][y],RMQ[log_elem][x+dim-(1<<log_elem)][y],RMQ[log_elem][x][y+dim-(1<<log_elem)],RMQ[log_elem][x+dim-(1<<log_elem)][y+dim-(1<<log_elem)]);
}
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;
}