Cod sursa(job #1045944)

Utilizator Dayanna000Amegica Dayanna Dayanna000 Data 2 decembrie 2013 13:44:24
Problema Plantatie Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.7 kb
#include <fstream>
#include <iostream>
#include <cmath>
using namespace std;
int a[11][501][501];
int main()
{
    int i,j,n,m,lat,h,k,x,y,s,p,maxi;
    ifstream f("plantatie.in");
    ofstream g("plantatie.out");
    f>>n>>m;
    for(i=1;i<=n;i++)
      for(j=1;j<=n;j++)
         f>>a[0][i][j];
    p=1;
    while((1<<p)<=n)
      {
          for(i=1;i<=n-(1<<p)+1;i++)
            for(j=1;j<=n-(1<<p)+1;j++)
               {
                   maxi=a[p-1][i][j];
                   if(a[p-1][i+(1<<(p-1))][j]>maxi)
                     maxi=a[p-1][i+(1<<(p-1))][j];
                   if(a[p-1][i+(1<<(p-1))][j+(1<<(p-1))]>maxi)
                     maxi=a[p-1][i+(1<<(p-1))][j+(1<<(p-1))];
                   if(a[p-1][i][j+(1<<(p-1))]>maxi)
                     maxi=a[p-1][i][j+(1<<(p-1))];
                   a[p][i][j]=maxi;
               }
            p++;
      }
    for(i=1;i<=m;i++)
      {
          f>>x>>y>>k;
          lat=k;
          h=(int)log2(k);
          s=(1<<h);
          if((1<<h)==k)
            g<<a[h][x][y]<<'\n';
            else
            {
                maxi=a[h][x][y];
                k=k-(1<<h);
                while(k>0)
                  {
                      h=(int)log2(k);
                      for(j=1;j<=lat-(1<<h)+1;j++)
                         {
                             if(a[h][x+j-1][y+s]>maxi)
                                maxi=a[h][x+j-1][y+s];
                             if(a[h][x+s][y+j-1]>maxi)
                                maxi=a[h][x+s][y+j-1];
                         }
                      s=s+(1<<h);
                      k=k-(1<<h);
                  }
                g<<maxi<<'\n';
            }
      }
    f.close();
    g.close();
    return 0;
}