Advertisement
tuki2501

JOI14_secret.cpp

Jan 31st, 2022
896
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 0.85 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #include "secret.h"
  3. using namespace std;
  4.  
  5. const int MAX_N = 1005;
  6.  
  7. int n, a[MAX_N], dat[MAX_N][15], mask[MAX_N];
  8.  
  9. void divi(int l, int r, int lev) {
  10.   if (l == r) return;
  11.   int m = (l + r) / 2;
  12.   dat[m][lev] = a[m];
  13.   for (int i = m - 1; i >= l; i--) {
  14.     dat[i][lev] = Secret(a[i], dat[i + 1][lev]);
  15.   }
  16.   dat[m + 1][lev] = a[m + 1];
  17.   for (int i = m + 2; i <= r; i++) {
  18.     dat[i][lev] = Secret(dat[i - 1][lev], a[i]);
  19.   }
  20.   for (int i = m + 1; i <= r; i++) {
  21.     mask[i] ^= (1 << lev);
  22.   }
  23.   divi(l, m, lev + 1);
  24.   divi(m + 1, r, lev + 1);
  25. }
  26.  
  27. void Init(int N, int A[]) {
  28.   n = N;
  29.   for (int i = 0; i < N; i++) {
  30.     a[i] = A[i];
  31.   }
  32.   divi(0, n - 1, 0);
  33. }
  34.  
  35. int Query(int L, int R) {
  36.   if (L == R) return a[L];
  37.   int bits = __builtin_ctz(mask[L] ^ mask[R]);
  38.   return Secret(dat[L][bits], dat[R][bits]);
  39. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement