제출 #1316636

#제출 시각아이디문제언어결과실행 시간메모리
1316636boclobanchatTriple Jump (JOI19_jumps)C++20
0 / 100
4094 ms18788 KiB
#include<bits/stdc++.h> using namespace std; const int MAXN=5e5+5; int A[MAXN],seg[MAXN*4],sp[MAXN][20],vi[MAXN]; bool ck[MAXN]; int getlog(long long n) { return 63-__builtin_clzll(n); } int rmq(int l,int r) { if(l>r) return -2e9; int lg=getlog(r-l+1); return max(sp[l][lg],sp[r-(1<<lg)+1][lg]); } void build(int l,int r,int pos) { if(l==r) { seg[pos]=l; return ; } int mid=(l+r)/2; build(l,mid,pos*2); build(mid+1,r,pos*2+1); if(A[seg[pos*2]]<A[seg[pos*2+1]]) seg[pos]=seg[pos*2+1]; else seg[pos]=seg[pos*2]; } void update(int l,int r,int i,int val,int pos) { if(i<l||r<i) return ; if(l==r) { seg[pos]=val; return ; } int mid=(l+r)/2; update(l,mid,i,val,pos*2); update(mid+1,r,i,val,pos*2+1); if(A[seg[pos*2]]<A[seg[pos*2+1]]) seg[pos]=seg[pos*2+1]; else seg[pos]=seg[pos*2]; } int get(int l,int r,int u,int v,int pos) { if(u<=l&&r<=v) return seg[pos]; int mid=(l+r)/2; if(v<=mid) return get(l,mid,u,v,pos*2); if(mid+1<=u) return get(mid+1,r,u,v,pos*2+1); int a=get(l,mid,u,v,pos*2),b=get(mid+1,r,u,v,pos*2+1); if(A[a]<A[b]) return b; return a; } int main() { ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); int n,q; cin>>n; for(int i=1;i<=n;i++) { cin>>A[i]; sp[i][0]=A[i]; } for(int j=1;(1<<j)<=n;j++) for(int i=1;i<=n-(1<<j)+1;i++) sp[i][j]=max(sp[i][j-1],sp[i+(1<<(j-1))][j-1]); cin>>q; build(1,n,1); for(int i=1;i<=q;i++) { int l,r; cin>>l>>r; int cnt=min(19,r-l+1); for(int j=1;j<=cnt;j++) { update(1,n,vi[j]=get(1,n,l,r,1),0,1); ck[vi[j]]=true; } int ans=0; for(int j=l;j<=r;j++) for(int k=j+1;k<=r;k++) for(int x=k*2-j;x<=r;x++) if(ck[j]+ck[k]+ck[x]>=2) ans=max(ans,A[j]+A[k]+A[x]); cout<<ans<<"\n"; for(int j=1;j<=cnt;j++) update(1,n,vi[j],vi[j],1),ck[vi[j]]=false; } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...