Cod sursa(job #1526980)

Utilizator starlingIon Popa starling Data 17 noiembrie 2015 18:51:09
Problema Plantatie Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.21 kb
#include <bits/stdc++.h>
using namespace std;
//http://www.infoarena.ro/problema/euclid
#define M 508
ifstream in("plantatie.in");
ofstream out("plantatie.out");
long int rmq[M][M][30],lg[M];
inline long int maxi(long int a, long int b)
{
 if(a>b)return a;
 return b;
}
inline void RMQ(long int n)
{  long int i,j,a,b;
b=lg[n];
for(a=1;a<=b;a++)
  for(i=1;i<=n;i++)
      for(j=1;j<=n;j++)
            {   int x,y,z;
                x=maxi(rmq[i][j][a-1],rmq[i][j+(1<<(a-1))][a-1]);
                y=maxi(x,rmq[i+(1<<(a-1))][j][a-1]);
                z=maxi(y,rmq[i+(1<<(a-1))][j+(1<<(a-1))][a-1]);
                rmq[i][j][a]=z;
            }
}
inline int get_rmq(long a, long b,long nr)
{
    long el=lg[nr];
    long int x=maxi(rmq[a][b][el],rmq[a][b+nr-(1<<(el))][el]);
    long int y=maxi(x, rmq[a+nr-(1<<el)][b][el]);
    return maxi(y,rmq[a+nr-(1<<el)][b+nr-(1<<el)][el]);
}
int main()
{  long m,n,h,w,t,nr,i,j,k,l,a,b;
    in>>n>>m;
    for(i=2;i<=508;i++)
        lg[i]=lg[i/2]+1;
   for(i=1;i<=n;i++)
        for(j=1;j<=n;j++)
            in>>rmq[i][j][0];
    RMQ(n);
    for(i=1;i<=m;i++)
    {
        in>>a>>b>>l;
        out<<get_rmq(a,b,l)<<'\n';
    }
    return 0;
}