Cod sursa(job #1527011)

Utilizator elevenstrArina Raileanu elevenstr Data 17 noiembrie 2015 19:30:36
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.57 kb
#include <bits/stdc++.h>
using namespace std;
//http://www.infoarena.ro/problema/euclid
#define M 608
ofstream out("plantatie.out");
int rmq[M][M][30],lg[M];
 FILE * fila = fopen ( "plantatie.in" , "r" );
inline int maxi( int a,  int b)
{
 if(a>b)return a;
 return b;
}
inline void RMQ(int n)
{  int i,j,a,b;
b=lg[n];
for(a=1;a<=b;a++)
  for(i=1;i<=n-(1<<a)+1;i++)
      for(j=1;j<=n-(1<<a)+1;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(int a, int b,int nr)
{
    int el=lg[nr];
    int x=maxi(rmq[a][b][el],rmq[a][b+nr-(1<<(el))][el]);
    int y=maxi(x, rmq[a+nr-(1<<el)][b][el]);
    return maxi(y,rmq[a+nr-(1<<el)][b+nr-(1<<el)][el]);
}
#define MAX 10000
char buff[MAX];
int poz=0;
void citire(int &numar)
{  numar=0;

while(isdigit(buff[poz])==0)
{
    ++poz;
    if(poz==MAX)
    {fread(buff,1,MAX,fila); poz=0;}
}
while(isdigit(buff[poz]))
{
    numar=numar*10+buff[poz]-'0';
    ++poz;
    if(poz==MAX){fread(buff,1,MAX,fila);poz=0;}
}

}
int main()
{  int m,n,h,w,t,nr,i,j,k,l,a,b;
    citire(n);
    citire(m);
    for(i=2;i<=n;i++)
        lg[i]=lg[i/2]+1;
   for(i=1;i<=n;i++)
        for(j=1;j<=n;j++)
            citire(rmq[i][j][0]);
    RMQ(n);
    for(i=1;i<=m;i++)
    {
        citire(a);
        citire(b);
        citire(l);
        out<<get_rmq(a,b,l)<<'\n';
    }
    return 0;
}