# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
197876 | Malomalomalomalo | Secret (JOI14_secret) | C++14 | 589 ms | 4600 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include "secret.h"
#include <bits/stdc++.h>
using namespace std;
vector<int> a(1000 + 5);
int n;
struct node{
node * c[2] = {nullptr, nullptr};
int m = 0,l,r;
vector<int> val;
void init(int l, int r){
this->l = l;this->r = r;
m = (r+l)/2;
val = vector<int>(r-l+1);
val[m-l] = a[m];
for(int i = m-1;i >= l; --i){
val[i-l] = Secret(a[i],val[i+1-l]);
}
val[m+1-l] = a[m+1];
for(int i = m+2;i <= r; ++i){
val[i-l] = Secret(a[i],val[i-1-l]);
}
if(r-l+1 >= 5){
c[0] = new node();
c[1] = new node();
if(m-l >= 2)c[0]->init(l,m-1);
if(r-(m+1) >= 2)c[1]->init(m+2,r);
}
}
int query(int L, int R){
if(R <= m-1){
return c[0]->query(L,R);
}
else if(L >= m+2){
return c[1]->query(L,R);
}
else{
assert(l <= L && r >= R);
if(R == m)return val[L-l];
else if(L == m + 1)return val[R-l];
else return Secret(val[L-l],val[R-l]);
}
}
} root;
void Init(int N, int A[]) {
n = N;
for(int i = 0;i < n; ++i)a[i] = A[i];
root.init(0,n-1);
}
int Query(int L, int R) {
return (L == R ? a[L] :root.query(L,R));
}
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |