Submission #1248853

#TimeUsernameProblemLanguageResultExecution timeMemory
1248853meisgoodGift Exchange (JOI24_ho_t4)C++20
100 / 100
1717 ms147888 KiB
#include <bits/stdc++.h>
using namespace std ;
// #define int long long
int A[500003] ;
int B[500003] ;
struct SEGT {
  int seg[4000003] ;
  int lzt[4000003] ;
  int type ;
  int get(int a,int b){
    if (type==0) return min(a,b) ;
    else return max(a,b) ;
  }
  void build(int ty){
    type=ty ;
    for (int i = 0 ; i < 4000003 ; i ++) seg[i]=lzt[i]=(type==0?INT_MAX:0) ;
  }
  void push_down(int id){
    lzt[id*2]=get(lzt[id*2],lzt[id]) ;
    lzt[id*2+1]=get(lzt[id*2+1],lzt[id]) ;
    seg[id*2]=get(seg[id*2],lzt[id]) ;
    seg[id*2+1]=get(seg[id*2+1],lzt[id]) ;
    lzt[id]=(type==0?INT_MAX:0) ;
  }
  void upd(int id,int l,int r,int ql,int qr,int x){
    if (ql<=l&&r<=qr) seg[id]=lzt[id]=get(seg[id],x) ;
    else if (l>qr||r<ql) ;
    else {
      int md=(l+r)/2 ;
      push_down(id) ;
      upd(id*2,l,md,ql,qr,x) ;
      upd(id*2+1,md+1,r,ql,qr,x) ;
      seg[id]=get(seg[id*2],seg[id*2+1]) ;
    }
  }
  int qq(int id,int l,int r,int ql,int qr){
    if (ql<=l&&r<=qr) return seg[id] ;
    else if (l>qr||r<ql) return (type==0?INT_MAX:0) ;
    else {
      int md=(l+r)/2 ;
      push_down(id) ;
      return get(qq(id*2,l,md,ql,qr),qq(id*2+1,md+1,r,ql,qr)) ;
    }
  }
} ;
int prv[500003],nxt[500003] ;
vector <int> ndel[500003] ;
signed main(){
  int N,i,j ;
  cin >> N ;
  for (i = 1 ; i <= N ; i ++) cin >> B[i],B[i]-- ;
  for (i = 1 ; i <= N ; i ++) cin >> A[i] ;
  SEGT mx,mn ;
  mx.build(1) ;
  mn.build(0) ;
  SEGT mnnd ;
  mnnd.build(1) ;
  for (i = 1 ; i <= N ; i ++){
    prv[i]=mx.qq(1,1,2*N,A[i],B[i]) ;
    ndel[prv[i]].push_back(i) ;
    mx.upd(1,1,2*N,A[i],B[i],i) ;
  }
  for (i = N ; i >= 1 ; i --){
    nxt[i]=mn.qq(1,1,2*N,A[i],B[i]) ;
    mn.upd(1,1,2*N,A[i],B[i],i) ;
  }
  int Q ;
  cin >> Q ;
  int ans[200003] ;
  vector <pair<int,int>> qs[500003] ;
  for (i = 1 ; i <= Q ; i ++){
    int a,b ;
    cin >> a >> b ;
    qs[a].push_back({b,i}) ;
  }
  for (auto x : ndel[0]){
    mnnd.upd(1,1,2*N,x,x,nxt[x]) ;
    // cout << x << " " << nxt[x] << endl ;
  }
  for (i = 1 ; i <= N ; i ++){
    for (auto [a,id] : qs[i]){
      if (mnnd.qq(1,1,2*N,i,a)>a) ans[id]=0 ;
      else ans[id]=1 ;
    }
    for (auto x : ndel[i]){
      mnnd.upd(1,1,2*N,x,x,nxt[x]) ;
      // cout << i << " " << x << " " << nxt[x] << endl ;
    }
  }
  for (i = 1 ; i <= Q ; i ++){
    if (ans[i]) cout << "Yes\n" ;
    else cout << "No\n" ;
  }
	return 0 ;
}
#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...