# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
1219631 | vanea | Secret (JOI14_secret) | C++20 | 0 ms | 0 KiB |
#include <bits/stdc++.h>
#include "secret.h"
using namespace std;
using ll = long long;
const int mxN = 1e3+10;
int dat[12][mxN], mask[mxN];
vector<int> x;
void divi(int l, int r, int lvl) {
if(l == r) return ;
int m = (l+r)/2;
dat[lvl][m] = x[m];
for(int i = m-1; i >= l; i--) dat[lvl][i] = Secret(x[i], dat[lvl][i+1]);
dat[lvl][m+1] = x[m+1];
for(int i = m+2; i <= r; i++) dat[lvl][i] = Secret(x[i], dat[lvl][i-1]);
for(int i = m+1; i <= r; i++) mask[i] |= (1 << lvl);
divi(l, m, lvl+1); divi(m+1, r, lvl+1);
}
void Init(int n, vector<int> a) {
for(auto it : a) x.push_back(it);
divi(0, n-1, 0);
}
int Query(int l, int r) {
if(l == r) return x[l];
int bits = __builtin_ctz(mask[l] ^ mask[r]);
return Secret(dat[bits][l], dat[bits][r]);
}