제출 #1010321

#제출 시각아이디문제언어결과실행 시간메모리
1010321ttamxGift Exchange (JOI24_ho_t4)C++17
100 / 100
1188 ms101624 KiB
#include<bits/stdc++.h> using namespace std; const int N=5e5+5; const int Q=2e5+5; const int K=(1<<21)+5; int n,q; int a[N],b[N]; int l[N],r[N]; vector<pair<int,int>> qr[N]; vector<int> upd[N]; bool ans[Q]; struct maxsegtree{ int t[K],lz[K]; void push(int l,int r,int i){ t[i]=max(t[i],lz[i]); if(l<r){ lz[i*2]=max(lz[i*2],lz[i]); lz[i*2+1]=max(lz[i*2+1],lz[i]); } lz[i]=0; } void update(int l,int r,int i,int x,int y,int v){ push(l,r,i); if(y<l||r<x)return; if(x<=l&&r<=y)return lz[i]=v,push(l,r,i); int m=(l+r)/2; update(l,m,i*2,x,y,v); update(m+1,r,i*2+1,x,y,v); t[i]=max(t[i*2],t[i*2+1]); } void update(int x,int y,int v){ update(1,n*2,1,x,y,v); } int query(int l,int r,int i,int x,int y){ push(l,r,i); if(y<l||r<x)return 0; if(x<=l&&r<=y)return t[i]; int m=(l+r)/2; return max(query(l,m,i*2,x,y),query(m+1,r,i*2+1,x,y)); } int query(int x,int y){ return query(1,n*2,1,x,y); } }sl; struct minsegtree{ int t[K],lz[K]; void push(int l,int r,int i){ t[i]=min(t[i],lz[i]); if(l<r){ lz[i*2]=min(lz[i*2],lz[i]); lz[i*2+1]=min(lz[i*2+1],lz[i]); } lz[i]=n+1; } void build(int l,int r,int i){ t[i]=lz[i]=n+1; if(l==r)return; int m=(l+r)/2; build(l,m,i*2); build(m+1,r,i*2+1); } void build(){ build(1,n*2,1); } void update(int l,int r,int i,int x,int y,int v){ push(l,r,i); if(y<l||r<x)return; if(x<=l&&r<=y)return lz[i]=v,push(l,r,i); int m=(l+r)/2; update(l,m,i*2,x,y,v); update(m+1,r,i*2+1,x,y,v); t[i]=min(t[i*2],t[i*2+1]); } void update(int x,int y,int v){ update(1,n*2,1,x,y,v); } int query(int l,int r,int i,int x,int y){ push(l,r,i); if(y<l||r<x)return n+1; if(x<=l&&r<=y)return t[i]; int m=(l+r)/2; return min(query(l,m,i*2,x,y),query(m+1,r,i*2+1,x,y)); } int query(int x,int y){ return query(1,n*2,1,x,y); } }sr; struct segtree{ int t[K]; void build(int l,int r,int i){ if(l==r)return void(t[i]=::l[l]); int m=(l+r)/2; build(l,m,i*2); build(m+1,r,i*2+1); t[i]=min(t[i*2],t[i*2+1]); } void build(){ build(1,n,1); } void update(int l,int r,int i,int x,int v){ if(x<l||r<x)return; if(l==r)return void(t[i]=v); int m=(l+r)/2; update(l,m,i*2,x,v); update(m+1,r,i*2+1,x,v); t[i]=min(t[i*2],t[i*2+1]); } void update(int x,int v){ update(1,n,1,x,v); } int query(int l,int r,int i,int x,int y){ if(y<l||r<x)return n+1; if(x<=l&&r<=y)return t[i]; int m=(l+r)/2; return min(query(l,m,i*2,x,y),query(m+1,r,i*2+1,x,y)); } int query(int x,int y){ return query(1,n,1,x,y); } }s; int main(){ cin.tie(nullptr)->sync_with_stdio(false); cin >> n; for(int i=1;i<=n;i++)cin >> a[i]; for(int i=1;i<=n;i++)cin >> b[i]; cin >> q; for(int i=1;i<=q;i++){ int l,r; cin >> l >> r; qr[r].emplace_back(l,i); } for(int i=1;i<=n;i++){ l[i]=sl.query(b[i],a[i]); sl.update(b[i],a[i],i); } sr.build(); for(int i=n;i>=1;i--){ r[i]=sr.query(b[i],a[i]); sr.update(b[i],a[i],i); } for(int i=1;i<=n;i++){ upd[r[i]].emplace_back(i); } s.build(); for(int i=1;i<=n;i++){ for(auto j:upd[i]){ s.update(j,n+1); } for(auto [ql,j]:qr[i]){ ans[j]=s.query(ql,i)>=ql; } } for(int i=1;i<=q;i++)cout << (ans[i]?"Yes":"No") << "\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...