Cod sursa(job #1526947)

Utilizator starlingIon Popa starling Data 17 noiembrie 2015 18:18:39
Problema Plantatie Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.78 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[19][19][M][M],lg[M],v[M];
inline long int maxi(long int a, long int b)
{
 if(a>b)return a;
 return b;
}
inline void RMQ(long int m,long int n)
{  long int i,j,a,b;
for(i=0;i<=lg[m];i++)
      for(j=0;j<=lg[n];j++)
        for(a=1;a<=m-(1<<i)+1;a++)
            for(b=1;b<=n-(1<<j)+1;b++)
            {   if(i==0&&j==0)continue;
                  int x,y,z;
                if(i==0)
                { x=maxi(rmq[i][j-1][a][b],rmq[i][j-1][a][b+(1<<(j-1))]);
                  rmq[i][j][a][b]=x;
                  continue;
                }
                if(j==0)
                { x=maxi(rmq[i-1][j][a][b],rmq[i-1][j][a+(1<<(i-1))][b]);
                  rmq[i][j][a][b]=x;
                  continue;
                }
                x=maxi(rmq[i-1][j-1][a+(1<<(i-1))][b+(1<<(j-1))],rmq[i-1][j-1][a][b]);
                y=maxi(x,rmq[i-1][j-1][a+(1<<(i-1))][b]);
                z=maxi(y,rmq[i-1][j-1][a][b+(1<<(j-1))]);
                rmq[i][j][a][b]=y;
            }

}
inline int get_rmq(long a, long b,long nrl, long nrc)
{  //////////
    long elc=lg[nrc],ell=lg[nrl];
    int x=maxi(rmq[ell][elc][a][b],rmq[ell][elc][a+nrl-(1<<ell)][b]);
    int y=maxi(x, rmq[ell][elc][a][b+nrc-(1<<elc)]);
    return maxi(y,rmq[ell][elc][a+nrl-(1<<ell)][b+nrc-(1<<elc)]);
}
int main()
{  long m,n,h,w,t,nr,i,j,k,l,ma=-1,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[0][0][i][j];
    RMQ(n,n);
    for(i=1;i<=m;i++)
    {
        in>>a>>b>>l;
        out<<get_rmq(a,b,l,l)<<'\n';
    }
    return 0;
}