Cod sursa(job #1684377)

Utilizator lflorin29Florin Laiu lflorin29 Data 10 aprilie 2016 23:53:32
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.15 kb
#include <bits/stdc++.h>

using namespace std;

int n , m , rmq[11][509][509], lg[511];

void cit()
{
  scanf("%d %d", &n , &m);
  for(int i = 1 ; i <=n; ++i)
    for(int j = 1 ; j <= n ; ++j)
       scanf("%d", &rmq[0][i][j]);
  for(int i = 2; i<= 505; ++i)
    lg[i] = lg[i>>1] + 1;
}

void build()
{
 for(int pas = 1 ; (1<<pas) <= n; ++pas) {
    int act = (1<<pas), bef = 1<<(pas-1);
    for(int i = 1; i + act-1 <= n ; ++i)
       for(int j = 1 ; j + act-1 <= n ; ++j)
           rmq[pas][i][j] = max({rmq[pas - 1][i][j], rmq[pas - 1][i + bef][j], rmq[pas - 1][i][j + bef], rmq[pas - 1][i + bef][j + bef]});
 }
}

int rasp(int i, int j, int k)
{
  int catl = lg[k];
  int val = 1 << catl;
  int to = j + k - 1;
  int to2 = i+k-1;
  return max({rmq[catl][i][j], rmq[catl][i][to - val + 1], rmq[catl][to2 - val + 1][j], rmq[catl][to2 - val + 1][to - val + 1]});
}

void solve()
{
  freopen("plantatie.out", "w", stdout);
  while(m--)
  {
    int i , j , k;
    scanf("%d%d%d", &i, &j, &k);
    printf("%d\n", rasp(i, j, k));
  }
}

int main()
{
  freopen("plantatie.in", "r", stdin);
  cit();
  build();
  solve();
}