제출 #1255948

#제출 시각아이디문제언어결과실행 시간메모리
1255948kamrad비밀 (JOI14_secret)C++20
0 / 100
341 ms16220 KiB
#include "secret.h"

#include <bits/stdc++.h>
using namespace std;

#define pb(x) push_back(x)
#define sz(x) x.size()

const int maxN   =  1e3 + 10;

int n;
int a[maxN];

struct SegTree {
	struct Node {
		int lsuf[maxN];
		int rpre[maxN];
	} t[maxN<<2];

	void initialize(int id, int L, int R) {
		if(L+1 == R) {
			t[id].lsuf[L] = a[L];
			return;
		}

		int mid = (L+R)>>1;
		initialize(2*id+0, L, mid);
		initialize(2*id+1, mid, R);
		
		t[id].lsuf[L] = a[L];
		for(int i = L+1; i < mid; i++)
			t[id].lsuf[i] = Secret(t[id].lsuf[i-1], a[i]);
		t[id].rpre[mid] = a[mid];
		for(int i = mid+1; i < R; i++)
			t[id].rpre[i] = Secret(t[id].rpre[i-1], a[i]);
	}

	int get(int id, int L, int R, int l, int r) {
		if(L+1 == R)
			return a[L];

		int mid = (L+R)>>1;
		if(l >= mid)
			return get(2*id+1, mid, R, l, r);
		if(r < mid)
			return get(2*id+0, L, mid, l, r);
		return Secret(t[id].lsuf[l], t[id].rpre[r]);
	}
} s;

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

int Query(int L, int R) {
	return s.get(1, 1, n+1, L+1, R+1);
}
#Verdict Execution timeMemoryGrader output
Fetching results...