Cod sursa(job #3229570)

Utilizator kywyPApescu tiGEriu kywy Data 16 mai 2024 18:20:05
Problema Range minimum query Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.84 kb
#include <fstream>
#include <iostream>

std::ifstream in("euclid.in");
std::ofstream out("euclid.out");

int rmq[9][9][401][401];
int log_table[401];
int t, m, n, h, w;

int gcd(int a, int b) {
  if (a % b == 0)
    return b;
  if (b % a == 0)
    return a;
  return gcd(a % b, b % a);
}

inline int gcd4(int a, int b, int c, int d) {
  return gcd(gcd(a, b), gcd(c, d));
}

void calc_rmq() {
  for (int lg1 = 0; (1 << lg1) <= m; lg1++) {
    for (int lg2 = 0; (1 << lg2) <= n; lg2++) {
      for (int i = 1; i <= m - (1 << lg1) + 1; i++) {
        for (int j = 1; j <= n - (1 << lg2) + 1; j++) {
          int A = 0, B = 0, C = 0, D = 0;
          if (lg1 != 0) {
            A = lg1 - 1;
            C = 1 << A;
          }
          if (lg2 != 0) {
            B = lg2 - 1;
            D = 1 << B;
          }
          rmq[A + (lg1 != 0)][B + (lg2 != 0)][i][j] =
              gcd4(rmq[A][B][i][j], rmq[A][B][i][j + D], rmq[A][B][i + C][j],
                   rmq[A][B][i + C][j + D]);
        }
      }
    }
  }
}

inline int get_area_gcd(int i, int j) {
  int lg1 = log_table[h], lg2 = log_table[w];
  return gcd4(rmq[lg1][lg2][i][j], rmq[lg1][lg2][i][j + w - (1 << lg2)],
              rmq[lg1][lg2][i + h - (1 << lg1)][j],
              rmq[lg1][lg2][i + h - (1 << lg1)][j + w - (1 << lg2)]);
}

void solve(int test) {
  int max_gcd = 1;
  for (int i = 1; i <= m - h + 1; i++) {
    for (int j = 1; j <= n - h + 1; j++) {
      max_gcd = std::max(max_gcd, get_area_gcd(i, j));
    }
  }
  out << "Case #" << test << ": " << max_gcd << '\n';
}

int main() {
  for (int i = 2; i <= 400; i++) {
    log_table[i] = log_table[i / 2] + 1;
  }
  in >> t;
  for (int test = 1; test <= t; test++) {
    in >> m >> n >> h >> w;
    for (int i = 1; i <= m; i++) {
      for (int j = 1; j <= m; j++) {
        in >> rmq[0][0][i][j];
      }
    }
    calc_rmq();
    solve(test);
  }
}