Cod sursa(job #3225315)

Utilizator Remus.RughinisRemus Rughinis Remus.Rughinis Data 17 aprilie 2024 12:25:01
Problema Plantatie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.6 kb
#include <iostream>
#include <fstream>
#include <bits/stdc++.h>
#define DEBUG 0
#define MAXN 500
#define LOGN 9

using namespace std;

int v[MAXN][MAXN], rmq[MAXN][MAXN][LOGN];

int main(){
  int n, q;

  ifstream fin ("plantatie.in");
  fin >> n >> q;
  for(int i = 0; i < n; i ++){
    for(int j = 0; j < n; j ++){
      fin >> v[i][j];
      rmq[i][j][0] = v[i][j];
    }
  }

  for(int pow = 1; (1 << pow) <= n; pow ++){
    for(int i = 0; i + (1 << pow) <= n; i ++){
      for(int j = 0; j + (1 << pow) <= n; j ++){
        int prev = 1 << (pow - 1);
        int maxv = max(0, rmq[i][j][pow - 1]);
        maxv = max(maxv, rmq[i + prev][j][pow - 1]);
        maxv = max(maxv, rmq[i][j + prev][pow - 1]);
        maxv = max(maxv, rmq[i + prev][j + prev][pow - 1]);

        rmq[i][j][pow] = maxv;
      }
    }
  }

  if(DEBUG){
    for(int pow = 0; (1 << pow) <= n; pow ++){
      printf("%d:\n", pow);
      for(int i = 0; i + (1 << pow) <= n; i ++){
        for(int j = 0; j + (1 << pow) <= n; j ++){
          printf("%d ", rmq[i][j][pow]);
        }
        printf("\n");
      }
      printf("\n");
    }
    fflush(NULL);
  }

  ofstream fout ("plantatie.out");
  for(int qi = 0; qi < q; qi ++){
    int a, b, c;
    fin >> a >> b >> c; // Query in patratul ((a, b), (a + c, b + c))
    a --;
    b --;
    int pow = log2(c);

    int maxv = max(0, rmq[a][b][pow]);
    maxv = max(maxv, rmq[a + c - (1 << pow)][b][pow]);
    maxv = max(maxv, rmq[a][b + c - (1 << pow)][pow]);
    maxv = max(maxv, rmq[a + c - (1 << pow)][b + c - (1 << pow)][pow]);

    fout << maxv << "\n";
  }

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

  return 0;
}