제출 #1255937

#제출 시각아이디문제언어결과실행 시간메모리
1255937kamrad비밀 (JOI14_secret)C++20
0 / 100
337 ms4712 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 {
		vector <int> lsuf;
		vector <int> rpre;
	} t[maxN<<2];

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

		int mid = (L+R)>>1;
		initialize(2*id+0, L, mid);
		initialize(2*id+1, mid, R);

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

	int get(int id, int L, int R, int l, int r) {
		if(L+1 == R)
			return t[id].lsuf[0];

		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[mid-1-l], t[id].rpre[r-mid-1]);
	}
} 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) {
	L++;
	R++;
	return s.get(1, 1, n+1, L, R+1);
}
#Verdict Execution timeMemoryGrader output
Fetching results...