Submission #348828

#TimeUsernameProblemLanguageResultExecution timeMemory
348828spatarelSecret (JOI14_secret)C++17
0 / 100
502 ms4972 KiB
#include "secret.h"
#include <map>

struct StructQuery {
  int left;
  int right;
};

bool operator < (const StructQuery &a, const StructQuery &b) {
  return (a.left < b.left)
      || (a.left == b.left && a.right < b.right);
}

int n;
std::map<StructQuery, int> secrets;

void querySecrets(int left, int right, int A[]) {
  if (left == right) {
    secrets[StructQuery{left, right}] = A[left];
  } else {
    int avg = (left + right) / 2;
    secrets[StructQuery{avg, avg}] = A[avg];
    for (int i = avg - 1; i >= left; i--) {
      secrets[StructQuery{i, avg}] =
          Secret(A[i], secrets[StructQuery{i + 1, avg}]);
    }
    secrets[StructQuery{avg + 1, avg + 1}] = A[avg + 1];
    for (int i = avg + 2; i <= right; i++) {
      secrets[StructQuery{avg + 1, i}] =
          Secret(secrets[StructQuery{avg + 1, i - 1}], i);
    }
    querySecrets(left, avg, A);
    querySecrets(avg + 1, right, A);
  }
}

void Init(int N, int A[]) {
  n = N;
  querySecrets(0, N - 1, A);
}

int Query(int L, int R) {
  int left = 0;
  int right = n - 1;
  while (true) {
    int avg = (left + right) / 2;
    if (R == avg || L == avg + 1) {
      return secrets[StructQuery{L, R}];
    } else if (L <= avg && avg + 1 <= R) {
      return Secret(secrets[StructQuery{L, avg}], secrets[StructQuery{avg + 1, R}]);
    } else if (R < avg) {
      right = avg;
    } else { // avg + 1 < L
      left = avg + 1;
    }
  }
  return -1;
}
#Verdict Execution timeMemoryGrader output
Fetching results...