Cod sursa(job #1024857)

Utilizator teoionescuIonescu Teodor teoionescu Data 9 noiembrie 2013 11:08:22
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.2 kb
#include<fstream>
#define max(a,b) (a>b?a:b)
#define min(a,b) (a<b?a:b)
using namespace std;
ifstream in("plantatie.in");
ofstream out("plantatie.out");
int N,M;
int A[505][505][20];
int lg[505];
int s1,s2,s3,s4;
void buildRMQ(){
    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++){
                int km=1<<(k-1);
                s1=A[i][j][k-1];
                s2=A[i+km][j][k-1];
                s3=A[i][j+km][k-1];
                s4=A[i+km][j+km][k-1];
                A[i][j][k]=max(max(s1,s2),max(s3,s4));
                //out<<k<<' '<<i<<' '<<j<<' '<<A[i][j][k]<<'\n';
            }
        }
    }
}
int RMQ(int &i,int &j,int &l){
    int k=lg[l];
    int p=1<<k;
    s1=A[i][j][k];
    s2=A[i+l-p][j][k];
    s3=A[i][j+l-p][k];
    s4=A[i+l-p][j+l-p][k];
    return max(max(s1,s2),max(s3,s4));
}
int main(){
    in>>N>>M;
    for(int i=1;i<=N;i++){
        for(int j=1;j<=N;j++){
            in>>A[i][j][0];
        }
    }
    for(int i=2;i<=N;i++) lg[i]=lg[i/2]+1;
    buildRMQ();
    for(int i=1;i<=M;i++){
        int a,b,c;
        in>>a>>b>>c;
        out<<RMQ(a,b,c)<<'\n';
    }
    return 0;
}