제출 #369505

#제출 시각아이디문제언어결과실행 시간메모리
369505kostia244비밀 (JOI14_secret)C++17
100 / 100
597 ms10816 KiB
#include "secret.h" #include<bits/stdc++.h> using namespace std; const int maxn = 1<<17; vector<int> L[maxn]; vector<int> R[maxn]; int n, a[maxn]; int oops(int x, int y) { //cout << x << " + " << y << endl; return Secret(x, y); } #define Secret oops void solve(int l, int r) { if(l >= r) return; int mid = (l+r)/2; L[mid] = {a[mid]}, R[mid] = {}; //cout << l << " | " << r << endl; for(int i = mid+1; i < r; i++) { if(R[mid].empty()) R[mid].push_back(a[i]); else R[mid].push_back(Secret(R[mid].back(), a[i])); //cout << "[" << mid+1 << ";" << i << "] = " << R[mid].back() << endl; } for(int i = mid; i-->l;) { if(!L[mid].empty()) L[mid].push_back(Secret(a[i], L[mid].back())); else L[mid].push_back(a[i]); //cout << "[" << i << ";" << mid << "] = " << L[mid].back() << endl; } solve(l, mid); solve(mid+1, r); } int query(int l, int r, int ql, int qr) { if(l >= r || qr <= l || r <= ql) return 0; int mid = (l+r)/2; if(ql <= mid && mid < qr) { //cout << ql << " " << qr << " " << mid << endl; qr = qr-mid-1; ql = mid-ql+1; //cout << ql << " " << qr << " " << mid << endl; if(ql == 0) return R[mid][qr-1]; if(qr == 0) return L[mid][ql-1]; return Secret(L[mid][ql-1], R[mid][qr-1]); } return query(l, mid, ql, qr)^query(mid+1, r, ql, qr); } void Init(int N, int A[]) { n = N; //for(int i = 0; i < n; i++) cout << A[i] << " "; cout << endl; for(int i = 0; i < n; i++) a[i] = A[i]; solve(0, N); } int Query(int L, int R) { return query(0, n, L, R+1); }
#Verdict Execution timeMemoryGrader output
Fetching results...