제출 #1359902

#제출 시각아이디문제언어결과실행 시간메모리
1359902jump비밀 (JOI14_secret)C++20
100 / 100
307 ms16364 KiB
#include "secret.h"
#include <iostream>
int pref[4100][1100];
int suff[4100][1100];
int a[1100];
void build(int c,int l,int r){
  if(l==r){
    pref[c][l]=a[l];
    return;
  }
  int mid=(l+r)/2;
  pref[c][mid+1]=a[mid+1];
  suff[c][mid]=a[mid];
  for(int i=mid+2;i<=r;i++)pref[c][i]=Secret(pref[c][i-1],a[i]);
  for(int i=mid-1;i>=l;i--)suff[c][i]=Secret(a[i],suff[c][i+1]);
  // std::cout << c << ' ' << l << ' ' << r << '\n';
  // for(int i=l;i<=mid;i++)std::cout << suff[c][i] << ' ';
  // std::cout << '|';
  // for(int i=mid+1;i<=r;i++)std::cout << pref[c][i] << ' ';
  // std::cout << '\n';
  build(c*2,l,mid);
  build(c*2+1,mid+1,r);
}
int ans(int c,int l,int r,int ql,int qr){
  if(l==r)return a[l];
  //std::cout << l << ' ' << r << ' ' << ql << ' ' << qr << '\n';
  int mid=(l+r)/2;
  if(ql<=mid&&mid<=qr){
    if(qr==mid)return suff[c][ql];
    return Secret(suff[c][ql],pref[c][qr]);
  }
  else if(qr<mid)return ans(c*2,l,mid,ql,qr);
  else if(ql>mid)return ans(c*2+1,mid+1,r,ql,qr);
  return -1;
}
int gN;
void Init(int N, int A[]) {
  gN=N;
  for(int i=1;i<=N;i++)a[i]=A[i-1];
  build(1,1,N);
}

int Query(int L, int R) {
  return ans(1,1,gN,L+1,R+1);
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…