Cod sursa(job #2011460)

Utilizator AlexandruLuchianov1Alex Luchianov AlexandruLuchianov1 Data 16 august 2017 12:47:09
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.6 kb
#include <iostream>
#include <fstream>

using namespace std;
ifstream in ("plantatie.in");
ofstream out ("plantatie.out");
int const nmax = 500;
int n;
int rmq[12][nmax + 1][nmax + 1];
int v[1 + nmax][1 + nmax];
int lg[1 + nmax];

void computermq(){
  for(int h = 1 ; h <= lg[n] ;h++){
    int lim = n - lg[h] + 1;
    for(int i = 1 ;i <= lim ;i++){
      for(int j = 1 ;j <= lim ;j++){
        int val = rmq[h - 1][i][j];
        if(val < rmq[h - 1][i + (1 << (h - 1) )][j] ){
          val = rmq[h - 1][i + (1 << (h - 1) )][j];
        }
        if(val < rmq[h - 1][i][j + (1 << (h - 1) ) ] ){
          val = rmq[h - 1][i][j + (1 << (h - 1) ) ];
        }
        if(val < rmq[h - 1][i + (1 << (h - 1) )][j + (1 << (h - 1) )] ){
          val = rmq[h - 1][i + (1 << (h - 1) )][j + (1 << (h - 1) )];
        }
        rmq[h][i][j] = val;
      }
    }
  }
}
int main()
{
  int q;
  in>>n>>q;
  for(int i = 2 ; i <= n ;i++){
    lg[i] = lg[(i >> 1)] + 1;
  }
  for(int i = 1 ; i <= n ;i++){
    for(int j = 1 ; j <= n ;j++){
      in>>v[i][j];
      rmq[0][i][j] = v[i][j];
    }
  }
  computermq();
  int x , y , k;
  for(int i = 0 ; i < q ;i++){
    in>>x>>y>>k;
    int h = lg[k];
    int val = rmq[h][x][y];

    if(val < rmq[h ][x + k - (1 << h )][y] ){
      val = rmq[h][x + k - (1 << h )][y];
    }
    if(val < rmq[h][x][y + k - (1 << h ) ] ){
      val = rmq[h ][x][y + k - (1 << h ) ];
    }
    if(val < rmq[h][x + k - (1 << h )][y + k - (1 << h  )] ){
      val = rmq[h ][x + k - (1 << h )][y + k - (1 << h )];
    }
    out<<val<<'\n';
  }
  return 0;
}