Submission #1135648

#TimeUsernameProblemLanguageResultExecution timeMemory
1135648NewtonabcGift Exchange (JOI24_ho_t4)C++20
100 / 100
1602 ms69792 KiB
#include<bits/stdc++.h> using namespace std; const int N=5e5+10; const int M=1<<21; const int K=2e5+10; int a[N],b[N],mnmode,base,l[N],r[N]; vector<int> in[N]; vector<pair<int,int>> ask[N]; bool ans[K]; int comp(int aa,int bb){ if(mnmode) return min(aa,bb); else return max(aa,bb); } int n; struct stree{ int s[M],lz[M]; void init(){for(int i=0;i<M;i++) s[i]=lz[i]=base;} void pushlz(int l,int r,int idx){ if(lz[idx]==base) return; s[idx]=lz[idx]; if(l!=r) lz[idx*2]=lz[idx],lz[idx*2+1]=lz[idx]; lz[idx]=base; } void update(int l,int r,int idx,int a,int b,int val){ pushlz(l,r,idx); if(b<l || a>r) return; if(a<=l && b>=r){ lz[idx]=val; pushlz(l,r,idx); return; } int m=(l+r)/2; update(l,m,idx*2,a,b,val); update(m+1,r,idx*2+1,a,b,val); s[idx]=comp(s[idx*2],s[idx*2+1]); } int query(int l,int r,int idx,int a,int b){ pushlz(l,r,idx); if(b<l || a>r) return (mnmode?n+1:0); if(a<=l && b>=r) return s[idx]; int m=(l+r)/2; return comp(query(l,m,idx*2,a,b),query(m+1,r,idx*2+1,a,b)); } }t; int main(){ cin>>n; for(int i=1;i<=n;i++) cin>>a[i]; for(int i=1;i<=n;i++) cin>>b[i]; base=0; t.init(); for(int i=1;i<=n;i++){ l[i]=t.query(1,2*n,1,b[i],a[i]); in[l[i]].push_back(i); t.update(1,2*n,1,b[i],a[i],i); } base=n+1; mnmode=1; t.init(); for(int i=n;i>=1;i--){ r[i]=t.query(1,2*n,1,b[i],a[i]); t.update(1,2*n,1,b[i],a[i],i); } base=n+1,mnmode=0; t.init(); /*for(int i=1;i<=n;i++) cout<<l[i] <<" "; cout<<"\n"; for(int i=1;i<=n;i++) cout<<r[i] <<" "; cout<<"\n";*/ for(int i=1;i<=n;i++) if(r[i]<=n) t.update(1,n,1,i,i,r[i]); //for(int i=1;i<=n;i++) cout<<t.query(1,n,1,i,i) <<" "; //cout<<"\n"; int q; cin>>q; for(int i=0;i<q;i++){ int ll,rr; cin>>ll >>rr; ask[ll].push_back({rr,i}); } for(int i=n;i>=1;i--){ for(int tmp:in[i]) t.update(1,n,1,tmp,tmp,0); /*for(int j=1;j<=n;j++) cout<<t.query(1,n,1,j,j) <<" "; cout<<"\n";*/ for(pair<int,int> tmp:ask[i]){ int k=t.query(1,n,1,i,tmp.first); if(tmp.first>=k) ans[tmp.second]=true; } } for(int i=0;i<q;i++){ if(ans[i]) cout<<"Yes"; else cout<<"No"; cout<<"\n"; } }
#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...