Submission #866006

#TimeUsernameProblemLanguageResultExecution timeMemory
866006lolismekSecret (JOI14_secret)C++14
100 / 100
397 ms4488 KiB
#include "secret.h" #include <vector> #include <iostream> using namespace std; const int NMAX = 2000; int n; int a[NMAX + 1]; int dp[20][NMAX + 1]; void divide(int level, int l, int r){ if(l == r){ dp[level][l] = a[l]; return; } int mid = (l + r) / 2; dp[level][mid] = a[mid]; for(int i = mid - 1; i >= l; i--){ dp[level][i] = Secret(a[i], dp[level][i + 1]); } if(mid + 1 <= r){ dp[level][mid + 1] = a[mid + 1]; } for(int i = mid + 2; i <= r; i++){ dp[level][i] = Secret(dp[level][i - 1], a[i]); } divide(level + 1, l, mid); divide(level + 1, mid + 1, r); } void Init(int N, int A[]){ n = N; for(int i = 0; i < N; i++){ a[i] = A[i]; } divide(1, 0, N - 1); } int getAns(int level, int l, int r, int L, int R){ int mid = (l + r) / 2; if(L <= mid && mid <= R){ if(R == mid){ return dp[level][L]; } return Secret(dp[level][L], dp[level][R]); } if(mid < L){ return getAns(level + 1, mid + 1, r, L, R); } return getAns(level + 1, l, mid, L, R); } int Query(int L, int R){ if(L == R){ return a[L]; } return getAns(1, 0, n - 1, L, R); } /* 5 1 2 3 4 5 1 3 4 1000 1 0 999 */
#Verdict Execution timeMemoryGrader output
Fetching results...