Cod sursa(job #2376377)

Utilizator vlad.ulmeanu30Ulmeanu Vlad vlad.ulmeanu30 Data 8 martie 2019 15:13:34
Problema Plantatie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.63 kb
#include <bits/stdc++.h>
#define maxn 500
#define maxl2 10
#define pii pair<int,int>
#define fi first
#define se second

using namespace std;

int v[maxn+5][maxn+5];
int dp[maxn+5][maxn+5][maxl2+5]; /// dp[i][j][k] = max din dreptunghiul (i,j), (i+(1<<k)-1,j+(1<<k)-1)

int max4 ( int a, int b, int c, int d ) { return max ( max(a,b), max (c,d) ); }

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

int rmq ( pii cs, pii cj )
{
  int p2i = getl2 ( cj.fi - cs.fi + 1, 0 ), p2j = getl2 ( cj.se - cs.se + 1, 0 );
  int M1 = max4 ( dp[cs.fi][cs.se][p2i], dp[cs.fi][cj.se-(1<<p2i)+1][p2i], dp[cj.fi-(1<<p2i)+1][cs.se][p2i], dp[cj.fi-(1<<p2i)+1][cj.se-(1<<p2i)+1][p2i] );
  int M2 = max4 ( dp[cs.fi][cs.se][p2j], dp[cs.fi][cj.se-(1<<p2j)+1][p2j], dp[cj.fi-(1<<p2j)+1][cs.se][p2j], dp[cj.fi-(1<<p2j)+1][cj.se-(1<<p2j)+1][p2j] );
  return max(M1,M2);
}

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

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

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

  int kM = getl2 ( n, 1 );
  for ( i = 0; i < n; i++ )
    for ( j = 0; j < n; j++ ) dp[i][j][0] = v[i][j];
  for ( k = 1; k <= kM; k++ )
    for ( i = 0; i < n - (1<<k) + 1; i++ )
      for ( j = 0; j < n - (1<<k) + 1; j++ )
        dp[i][j][k] = max4 ( dp[i][j][k-1], dp[i+(1<<(k-1))][j][k-1], dp[i][j+(1<<(k-1))][k-1], dp[i+(1<<(k-1))][j+(1<<(k-1))][k-1] );

  int a, b, c;
  while (t--) fin >> a >> b >> c, fout << rmq ( {a-1,b-1}, {a+c-2,b+c-2} ) << '\n';

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

  return 0;
}