제출 #1236386

#제출 시각아이디문제언어결과실행 시간메모리
1236386wetspongeGift Exchange (JOI24_ho_t4)C++20
88 / 100
313 ms122108 KiB
#include <bits/stdc++.h> using namespace std; #define int long long #define endl "\n" #define mod 1000000007 int n,k,A[200001],B[200001],L[200001],R[200001],ans[200001]; const int N=(1ll<<20); int TreeMN[3][N*2+5],TreeMX[3][N*2+5]; int inf=1e18; vector <array<int,2>> qu[200001]; vector <int> p[200001]; void updateMN(int i,int val,int u){ i+=N; TreeMN[u][i]=val; i/=2; while(i!=0){ TreeMN[u][i]=min(TreeMN[u][i*2],TreeMN[u][i*2+1]); i/=2; } return; } void updateMX(int i,int val,int u){ i+=N; TreeMX[u][i]=val; i/=2; while(i!=0){ TreeMX[u][i]=max(TreeMX[u][i*2],TreeMX[u][i*2+1]); i/=2; } return; } int solveMN(int l1,int r1,int i,int l,int r,int u){ if(l1>r||l>r1) return n+1; if(l<=l1&&r1<=r) return TreeMN[u][i]; return min(solveMN(l1,(l1+r1)/2,i*2,l,r,u),solveMN((l1+r1)/2+1,r1,i*2+1,l,r,u)); } int solveMX(int l1,int r1,int i,int l,int r,int u){ if(l1>r||l>r1) return 0; if(l<=l1&&r1<=r) return TreeMX[u][i]; return max(solveMX(l1,(l1+r1)/2,i*2,l,r,u),solveMX((l1+r1)/2+1,r1,i*2+1,l,r,u)); } int solveMN2(int i,int u){ i+=N; int ans=n+1; while(i!=0){ //cout<<i<<" "<<TreeMN[u][i]<<endl; ans=min(ans,TreeMN[u][i]); i/=2; } return ans; } int solveMX2(int i,int u){ i+=N; int ans=0; while(i!=0){ ans=max(ans,TreeMX[u][i]); i/=2; } return ans; } void updateMN2(int l1,int r1,int i,int l,int r,int u,int val){ if(l1>r||l>r1) return; if(l<=l1&&r1<=r){ TreeMN[u][i]=min(TreeMN[u][i],val); return; } updateMN2(l1,(l1+r1)/2,i*2,l,r,u,val); updateMN2((l1+r1)/2+1,r1,i*2+1,l,r,u,val); return; } void updateMX2(int l1,int r1,int i,int l,int r,int u,int val){ if(l1>r||l>r1) return; if(l<=l1&&r1<=r){ TreeMX[u][i]=max(TreeMX[u][i],val); return; } updateMX2(l1,(l1+r1)/2,i*2,l,r,u,val); updateMX2((l1+r1)/2+1,r1,i*2+1,l,r,u,val); return; } signed main(){ ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); cin>>n; for(int i=0;i<=N*2+4;i++){ TreeMN[0][i]=TreeMN[1][i]=TreeMN[2][i]=n+1; TreeMX[0][i]=TreeMX[1][i]=TreeMX[2][i]=0; } for(int i=1;i<=n;i++) cin>>A[i]; for(int i=1;i<=n;i++) cin>>B[i]; for(int i=1;i<=n;i++){ updateMX(A[i],i,0); updateMX(B[i],i,0); L[i]=solveMX(0,N-1,1,B[i]+1,A[i]-1,0); L[i]=max(L[i],solveMX2(A[i],2)); updateMX2(0,N-1,1,B[i],A[i],2,i); } for(int i=n;i>=1;i--){ updateMN(A[i],i,0); updateMN(B[i],i,0); R[i]=solveMN(0,N-1,1,B[i]+1,A[i]-1,0); //cout<<i<<" "<<solveMN2(A[i],2)<<endl; R[i]=min(R[i],solveMN2(A[i],2)); updateMN2(0,N-1,1,B[i],A[i],2,i); p[L[i]].push_back(i); } //for(int i=1;i<=n;i++) cout<<L[i]<<" "<<R[i]<<endl; int q; cin>>q; for(int i=0;i<q;i++){ int l,r; cin>>l>>r; qu[l].push_back({r,i}); } for(int l=0;l<=n;l++){ for(auto [r,idx]:qu[l]){ if(solveMX(0,N-1,1,l,r,1)<=r) ans[idx]=1; } for(int idx:p[l]){ updateMX(idx,R[idx],1); } } for(int i=0;i<q;i++){ if(ans[i]==1) cout<<"Yes"<<endl; else cout<<"No"<<endl; } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...