Submission #1273565

#TimeUsernameProblemLanguageResultExecution timeMemory
1273565_filya_Secret (JOI14_secret)C++20
0 / 100
334 ms4460 KiB
#include "secret.h"
#include<bits/stdc++.h>

using namespace std;

vector<int> a, mask;
vector<vector<int>> dat;

void divide(int l, int r, int level) {
  if (r - l + 1 <= 2) return;
  int m = (r + l) / 2;
  dat[level][m] = a[m];
  for (int i = m - 1; i >= l; i--) dat[level][i] = Secret(a[i], dat[level][i + 1]);
  dat[level][m + 1] = a[m + 1];
  for (int i = m + 2; i <= r; i++) dat[level][i] = Secret(dat[level][i - 1], a[i]);
  for (int i = m + 1; i <= r; i++) mask[i] ^= (1 << level);
  divide(l, m, level + 1); divide(m + 1, r, level + 1);
}

void Init(int N, int A[]) {
  int n = N;
  a.assign(n, 0);
  mask.assign(n, 0);
  for (int i = 0; i < n; i++) a[i] = A[i];
  dat.assign(8, vector<int>(n, 0));
  divide(0, n - 1, 0);
}

int Query(int L, int R) {
  if (L == R) return a[L];
  else if (R - L + 1 == 2) return Secret(a[L], a[R]);
  else {
    int lvl = __builtin_ctz(mask[L] ^ mask[R]);
    return Secret(dat[lvl][L], dat[lvl][R]);
  }
  return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...