Cod sursa(job #2334652)

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

using namespace std;

int v[maxn*maxn+5];
int dp[maxl2+5][maxn*maxn+5];

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

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

int main ()
{
  ifstream fin ( "plantatie.in" );
  ofstream fout ( "plantatie.out" );

  int n, t;
  fin >> n >> t;

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

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

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

  int a, b, k, ans;
  while (t--)
  {
    fin >> a >> b >> 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} ));
    fout << ans << '\n';
  }

  fin.close ();
  fout.close ();

  return 0;
}