Submission #1135895

#TimeUsernameProblemLanguageResultExecution timeMemory
1135895KhoaDuySecret (JOI14_secret)C++20
100 / 100
342 ms4688 KiB
#include "secret.h" #include<bits/stdc++.h> using namespace std; const int MAXN=1000; struct node{ vector<int> pre; vector<int> suf; }; node seg[4*MAXN+1]; int n; void dnc(int v,int TL,int TR,int a[]){ int sz=TR-TL+1; if(v>1&&v&1){ seg[v].pre.resize(sz); seg[v].pre[0]=a[TL]; for(int i=1;i<sz;i++){ seg[v].pre[i]=Secret(seg[v].pre[i-1],a[i+TL]); } } if(v>1&&!(v&1)){ seg[v].suf.resize(sz); seg[v].suf[sz-1]=a[TR]; for(int i=sz-2;i>=0;i--){ seg[v].suf[i]=Secret(a[i+TL],seg[v].suf[i+1]); } } if(TL==TR){ if(v==1){ seg[v].pre.resize(sz); seg[v].pre[0]=a[TL]; } return; } int TM=((TL+TR)>>1); dnc(v<<1,TL,TM,a); dnc((v<<1)|1,TM+1,TR,a); } void Init(int N,int a[]){ n=N; dnc(1,0,n-1,a); } int calc(int v,int TL,int TR,int l,int r){ if(TL==TR){ if(v&1){ return seg[v].pre[0]; } else{ return seg[v].suf[0]; } } int TM=((TL+TR)>>1); if(TL<=l&&r<=TM){ return calc(v<<1,TL,TM,l,r); } else if(TM+1<=l&&r<=TR){ return calc((v<<1)|1,TM+1,TR,l,r); } else{ int curr=Secret(seg[v<<1].suf[l-TL],seg[(v<<1)|1].pre[r-TM-1]); return curr; } } int Query(int l,int r){ return calc(1,0,n-1,l,r); }
#Verdict Execution timeMemoryGrader output
Fetching results...