Cod sursa(job #423488)

Utilizator perticas_catalinperticas catalin perticas_catalin Data 23 martie 2010 22:31:08
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.87 kb
#include<iostream>
#include<string>

using namespace std;

#define NM 505
#define KM 10

int N,Q;

int A[NM][NM], RMQ[NM][NM][KM], LG[NM];

int main()
{
    int p2[KM],a,b,k;
    
    freopen("plantatie.in","r",stdin);
    freopen("plantatie.out","w",stdout);
    
    p2[0]=1;
    
    for(int i=1;i<KM;++i)
       p2[i]=p2[i-1]*2;
    
    scanf("%d %d",&N,&Q);
    
    for(int i=1;i<=N;++i)
       for(int j=1;j<=N;++j)
           scanf("%d",&A[i][j]);
    
    for(int i=1;i<=N;++i)
       for(int j=1;j<=N;++j)
           RMQ[i][j][0]=A[i][j];
    
    for(int p=1;p<KM;++p)
       for(int i=1;i<=N;++i)
       {
           if(i+p2[p]-1>N) break;
           
           for(int j=1;j<=N;++j)
           {
                if(j+p2[p]-1>N) break;
                
                int b1=RMQ[i][j][p-1];
                int b2=RMQ[i][j+p2[p-1]][p-1];
                int b3=RMQ[i+p2[p-1]][j][p-1];
                int b4=RMQ[i+p2[p-1]][j+p2[p-1]][p-1];
                
                b1=max(b1,b2);
                b3=max(b3,b4);
                RMQ[i][j][p]=max(b1,b3);   
           }    
       }      
       
    int ind=1, p=0;
    
    while(ind <= N)
    {
         int q=p2[p];     
              
         while(ind <= N && q)
         {
              LG[ind]=p;     
              ++ind;     
              --q;     
         }    
         
         ++p; 
    }   
    
    while(Q--)
    {
         scanf("%d %d %d",&a,&b,&k);     
         
         int pmax=LG[k];
         
         int b1=RMQ[a][b][pmax];
         int b2=RMQ[a][b+k-p2[pmax]][pmax];
         int b3=RMQ[a+k-p2[pmax]][b][pmax];
         int b4=RMQ[a+k-p2[pmax]][b+k-p2[pmax]][pmax];
         
         b1=max(b1,b2);
         b3=max(b3,b4);
         int ans=max(b1,b3);
         
         printf("%d\n",ans);
    }
    
    return 0;
}