Submission #1282114

#TimeUsernameProblemLanguageResultExecution timeMemory
1282114baotoan655Secret (JOI14_secret)C++20
100 / 100
342 ms4444 KiB
#include <bits/stdc++.h>
#include "secret.h"
#define file(name)  if (fopen(name".inp", "r")) { freopen(name".inp", "r", stdin); freopen(name".out", "w", stdout); }
using namespace std;

const int N = 1001;
int n;
int a[N];
int f[10][N];


void build(int l, int r, int k) {
    if (l >= r)
        return;

    int mid = (l + r) / 2;
    int crr = a[mid];

    for (int i = mid; i >= l; i--) {
        f[k][i] = crr;
        if (i > l) crr = Secret(a[i - 1], crr);
    }
    crr = a[mid + 1];
    for (int i = mid + 1; i <= r; i++) {
        f[k][i] = crr;
        if (i < r) crr = Secret(crr, a[i + 1]);
    }

    build(l, mid, k + 1);
    build(mid + 1, r, k + 1);
}

void Init(int _n, int A[]) {
    n = _n;
    for (int i = 0; i < n; i++) a[i] = A[i];
    build(0, n - 1, 0);
}

int Query(int l, int r) {
    int L = 0, R = n - 1, k = 0;
    while (1) {
        int mid = (L + R) / 2;
        if (l >= L && r <= R) {
            if (r == mid) return f[k][l];
            if (l == mid + 1) return f[k][r];
            if (l <= mid && r > mid) return Secret(f[k][l], f[k][r]);
        }
        if (r <= mid) R = mid;
        else L = mid + 1;
        k++;
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...