Submission #1366675

#TimeUsernameProblemLanguageResultExecution timeMemory
1366675chithanhnguyen비밀 (JOI14_secret)C++20
100 / 100
286 ms4352 KiB
/*
Author: Nguyen Chi Thanh - High School for the Gifted - VNU.HCM (i2528)
*/
#include "secret.h"
#include <bits/stdc++.h>
using namespace std;

#ifdef NCTHANH
// Copied from sample grader
const int MAX_VALUE = 1000000000;
int query_count = 0;
int Secret(int X, int Y) {
    ++query_count;
    if (!(0 <= X && X <= MAX_VALUE)) {
        fprintf(stderr, "Wrong Answer [1]\n");
        exit(0);
    }
    if (!(0 <= Y && Y <= MAX_VALUE)) {
        fprintf(stderr, "Wrong Answer [1]\n");
        exit(0);
    }
    return (X + 2 * (Y / 2) < MAX_VALUE) ? (X + 2 * (Y / 2)) : MAX_VALUE;
}
#endif

const int MAXN = 1005;
const int LG   = 10;
int n, a[MAXN], info[LG + 1][MAXN];

void dnc(int l, int r, int level) {
    if (l == r) return;

    int mid = (l + r) >> 1;
    info[level][mid] = a[mid];
    for (int i = mid - 1; i >= l; --i)
        info[level][i] = Secret(a[i], info[level][i + 1]);

    info[level][mid + 1] = a[mid + 1];
    for (int i = mid + 2; i <= r; ++i)
        info[level][i] = Secret(info[level][i - 1], a[i]);

    dnc(l, mid, level + 1);
    dnc(mid + 1, r, level + 1);
    return;
}

void Init(int N, int A[]) {
    n = N;
    for (int i = 1; i <= n; ++i) a[i] = A[i - 1];
    dnc(1, n, 1);

    return;
}

int Query(int l, int r) {
    ++l; ++r;

    if (l == r) return a[l];

    int curL = 1, curR = n, level = 1;
    while (true) {
        int mid = (curL + curR) >> 1;
        if (l <= mid && r > mid)
            return Secret(info[level][l], info[level][r]);
        if (r <= mid) curR = mid;
        else curL = mid + 1;

        ++level;
    }
}

#ifdef NCTHANH
int N, Q, A[MAXN];
signed main() {
    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);
    ios_base::sync_with_stdio(0);
    cin.tie(nullptr); cout.tie(nullptr);

    cin >> N;
    for (int i = 0; i < N; ++i) cin >> A[i];
    Init(N, A);
    cin >> Q;
    for (int i = 0; i < Q; ++i) {
        int l, r; cin >> l >> r;
        cout << Query(l, r) << '\n';
    }

    return 0;
}
#endif
#Result Execution timeMemoryGrader output
Fetching results...