Submission #543185

#TimeUsernameProblemLanguageResultExecution timeMemory
543185_karan_gandhiSecret (JOI14_secret)C++17
100 / 100
472 ms4492 KiB
#include "secret.h" #include <bits/stdc++.h> using namespace std; int MX_lv = 20; int n; vector<int> arr; vector<vector<int>> dat; void divi(int l, int r, int level) { if (l == r) return; assert(level < MX_lv); int mid = (l + r) / 2; dat[mid][level] = arr[mid]; dat[mid + 1][level] = arr[mid + 1]; for (int i = mid - 1; i >= l; i--) { dat[i][level] = Secret(arr[i], dat[i + 1][level]); } for (int i = mid + 2; i <= r; i++) { dat[i][level] = Secret(dat[i - 1][level], arr[i]); } divi(l, mid, level + 1); divi(mid + 1, r, level + 1); } void Init(int N, int A[]) { n = N; arr.resize(n); dat = vector<vector<int>>(N, vector<int>(MX_lv)); for (int i = 0; i < n; i++) { arr[i] = A[i]; } divi(0, n - 1, 0); } int Query(int L, int R) { if (L == R) return arr[L]; // binary search to find the level int hi = n - 1, lo = 0; int lv = 0; while (hi >= lo) { int mid = (hi + lo) / 2; if (L <= mid && mid < R) { return Secret(dat[L][lv], dat[R][lv]); } else if (L > mid) { lo = mid + 1; } else { hi = mid; } lv++; } assert(0); return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...