Cod sursa(job #1264705)

Utilizator buzu.tudor67Tudor Buzu buzu.tudor67 Data 16 noiembrie 2014 01:21:21
Problema Plantatie Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.45 kb
#include<fstream>
using namespace std;
ifstream fi("plantatie.in");
ofstream fo("plantatie.out");
 
const int MAX_N = 502;
const int MAX_LOG_N = 10;
 
int logaritm[MAX_N],c[MAX_N][MAX_N][MAX_LOG_N];
int i,j,k,n,q,x,y,lung,maxim,aux;
 
int main(){
    fi>>n>>q;
     
    for(i=1;i<=n;i++)
      for(j=1;j<=n;j++)
        fi>>c[i][j][0];
     
    for(k=1; (1<<k)<=n; k++)
      for(i=1; i+(1<<k)-1<=n; i++)
        for(j=1; j+(1<<k)-1<=n; j++)
           {
            maxim=c[i][j][k-1];
            
            aux=c[i][j+(1<<(k-1))][k-1];
            if(aux>maxim) maxim=aux;
            
            aux=c[i+(1<<(k-1))][j][k-1];
            if(aux>maxim) maxim=aux;
            
            aux=c[i+(1<<(k-1))][j+(1<<(k-1))][k-1];
            if(aux>maxim) maxim=aux;
            
            c[i][j][k]=maxim;
           }
    
    for(i=2;i<MAX_LOG_N;i++)
      logaritm[i]=logaritm[i/2]+1;
     
    for(;q>0;--q)
       {
        fi>>x>>y>>lung;
                  
        k=logaritm[lung];
        maxim=c[x][y][k];
                  
        aux=c[x][y + lung - (1<<k)][k];
        if(aux>maxim) maxim=aux;
                  
        aux=c[x + lung - (1<<k)][y][k];
        if(aux>maxim) maxim=aux;
                  
        aux=c[x + lung - (1<<k)][y + lung - (1<<k)][k];
        if(aux>maxim) maxim=aux;
                  
        fo<<maxim<<'\n';
       }
     
    fi.close();
    fo.close();
    return 0;
}