#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 time | Memory | Grader output |
---|
Fetching results... |