Cod sursa(job #2334655)

Utilizator vlad.ulmeanu30Ulmeanu Vlad vlad.ulmeanu30 Data 2 februarie 2019 20:30:53
Problema Plantatie Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.53 kb
#include <bits/stdc++.h>
#define maxn 500
#define maxl2 18
#define fi first
#define se second
#define DIM 1000000

using namespace std;

FILE *fin, *fout;
int v[maxn*maxn+5];
int dp[maxn*maxn+5][maxl2+5];
char BUFF[DIM+5];
int k;

void _reset ()
{
  if ( k == DIM )
  {
    fread ( BUFF, 1, DIM, fin );
    k = 0;
  }
}

void _read ( int &nr )
{
  nr = 0;
  while ( BUFF[k] < '0' || BUFF[k] > '9' )
  {
    k++;
    _reset ();
  }
  while ( BUFF[k] >= '0' && BUFF[k] <= '9' )
  {
    nr = nr * 10 + BUFF[k++] - '0';
    _reset ();
  }
}

int getl2 ( int pin, int n )
{
  int x = log(n) / log(2);
  x += ( ((1<<x) < n) && pin );
  return x;
}

inline int rmq ( pair<int,int> itv )
{
  int l2 = getl2 ( 0, itv.se - itv.fi + 1 );
  return max ( dp[itv.fi][l2], dp[itv.se-(1<<l2)+1][l2] );
}

int main ()
{
  fin = fopen ( "plantatie.in", "r" );
  fout = fopen ( "plantatie.out", "w" );

  int n, t;
  _read(n); _read(t);

  int i, j, sn;
  for ( i = 0, sn = n * n; i < sn; i++ )
    _read(v[i]);

  for ( i = 0; i < sn; i++ )
    dp[i][0] = v[i];

  int lm = getl2 ( 1, sn );
  for ( i = 1; i <= lm; i++ )
    for ( j = 0; j <= sn - (1<<i); j++ )
      dp[j][i] = max ( dp[j][i-1], dp[j+(1<<(i-1))][i-1] );

  int a, b, k, ans;
  while (t--)
  {
    _read(a); _read(b); _read(k);
    a--; b--;
    for ( ans = 0, i = 0; i < k; i++ )
      ans = max ( ans, rmq ( {(a+i)*n+b, (a+i)*n+b+k-1} ));
    fprintf ( fout, "%d\n", ans );
  }

  fclose ( fin );
  fclose ( fout );

  return 0;
}