Cod sursa(job #971582)

Utilizator RaduGabriel2012Dinu Radu RaduGabriel2012 Data 9 iulie 2013 17:25:15
Problema Plantatie Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.18 kb
#include <iostream>
#include <fstream>
#include <algorithm>
using namespace std;
ifstream f("plantatie.in");
ofstream g("plantatie.out");
int n,m,a[505][505],lg[505],mn[505][505][19];
void Read()
{ int i,j;
    f>>n>>m;
   for(i=1;i<=n;i++)
   for(j=1;j<=n;j++)
   f>>a[i][j];
}
void Process()
{ int i,j,lim,log;
   for(i=2;i<=n;i++)
    lg[i]=lg[i/2]+1;
  for(i=1;i<=n;i++)
   for(j=1;j<=n;j++)
    mn[i][j][0]=a[i][j];

  for(log=1;(1<<log)<=n;log++)
   { lim=n-(1<<log)+1;
    for(i=1;i<=lim;i++)
     for(j=1;j<=lim;j++)
     { mn[i][j][log]=max(mn[i][j][log-1],mn[i][j+(1<<(log-1))][log-1]);
       mn[i][j][log]=max(mn[i][j][log],mn[i+(1<<(log-1))][j][log-1]);
       mn[i][j][log]=max(mn[i][j][log],mn[i+(1<<(log-1))][j+(1<<(log-1))][log-1]);
     }
   }
}
void Solve()
{ int i,j,l,lat,x,y,sol;
    for(i=1;i<=m;i++)
     { f>>x>>y>>lat;
         l=lg[lat]; //g<<l<<"\n";
      sol=max(mn[x][y][l],mn[x+lat-1-(1<<l)+1][y][l]);
      sol=max(sol,mn[i][y+lat-1-(1<<l)+1][l]);
      sol=max(sol,mn[x+lat-1-(1<<l)+1][y+lat-1-(1<<l)+1][l]);
      g<<sol<<"\n";
     }
     //cout<<mn[1][1][3];
}
int main()
{ Read();
  Process();
  Solve();
    return 0;
}