Submission #1150673

#TimeUsernameProblemLanguageResultExecution timeMemory
1150673imarnGift Exchange (JOI24_ho_t4)C++20
88 / 100
965 ms85572 KiB
#include<bits/stdc++.h>
#pragma GCC optimize("O3")
#pragma GCC target("avx2")
#define ll long long
#define pii pair<int,int>
#define pll pair<ll,ll>
#define plx pair<ll,int>
#define f first
#define s second
#define pb push_back
#define all(x) x.begin(),x.end()
#define vi vector<int>
#define vvi vector<vi>
#define pp pair<ll,int>
#define ub(x,i) upper_bound(all(x),i)-x.begin()
#define lb(x,i) lower_bound(all(x),i)-x.begin()
#define t3 tuple<int,int,int>
#define sz(x) (ll)x.size()
using namespace std;
const int mxn=5e5+5;
int a[mxn],b[mxn],l[mxn],r[mxn],ans[mxn];
struct seg{
    int t[8*mxn]{0},lz[8*mxn]{0};
    void build(int x){
        for(int i=0;i<4*mxn;i++)t[i]=x,lz[i]=1e9;
    }
    void push(int i,int l,int r){
        t[i]=min(lz[i],t[i]);
        if(l<r)lz[2*i]=min(lz[i],lz[2*i]),lz[2*i+1]=min(lz[2*i+1],lz[i]);
        lz[i]=1e9;
    }
    void upd(int i,int l,int r,int tl,int tr,int v){
        push(i,l,r);
        if(r<tl||l>tr)return;
        if(r<=tr&&l>=tl){
            lz[i]=min(lz[i],v);push(i,l,r);return;
        }int m=(l+r)>>1;upd(2*i,l,m,tl,tr,v);upd(2*i+1,m+1,r,tl,tr,v);
        t[i]=min(t[2*i],t[2*i+1]);
    }
    int qr(int i,int l,int r,int tl,int tr){
        push(i,l,r);
        if(r<tl||l>tr)return 1e9;
        if(r<=tr&&l>=tl)return t[i];
        int m=(l+r)>>1;
        return min(qr(2*i,l,m,tl,tr),qr(2*i+1,m+1,r,tl,tr));
    }
}sl,sr;
int sg[2*mxn]{0};
void upd(int i,int sz,int amt){
    i+=sz;sg[i]=amt;
    for(i>>=1;i;i>>=1)sg[i]=min(sg[2*i],sg[2*i+1]);
}
int qr(int l,int r,int sz,int rs=1e9){
    for(l+=sz,r+=sz;l<r;l>>=1,r>>=1){
        if(l&1)rs=min(rs,sg[l++]);
        if(r&1)rs=min(rs,sg[--r]);
    }return rs;
}vector<int>up[mxn];
vector<pii>query[mxn];
int main(){
    ios_base::sync_with_stdio(0);cin.tie(0);
    int n;cin>>n;sl.build(0);sr.build(1e9);
    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++){
        l[i]=-sl.qr(1,1,2*n,b[i],a[i]);
        sl.upd(1,1,2*n,b[i],a[i],-i);
    }for(int i=1;i<=n;i++)sg[i+n-1]=l[i];
    for(int i=n-1;i>0;i--)sg[i]=min(sg[2*i],sg[2*i+1]);
    for(int i=n;i>=1;i--){
        r[i]=sr.qr(1,1,2*n,b[i],a[i]);
        sr.upd(1,1,2*n,b[i],a[i],i);
    }
    for(int i=1;i<=n;i++){
        if(r[i]==1e9)continue;
        up[r[i]].pb(i);
    }int q;cin>>q;
    for(int i=1;i<=q;i++){
        int l,r;cin>>l>>r;
        query[r].pb({l,i});
    }
    for(int i=1;i<=n;i++){
        for(auto it : up[i]){
            upd(it-1,n,1e9);
        }
        for(auto [tl,id]:query[i]){
            ans[id] = (qr(tl-1,i,n)>=tl?1:0);
        }
    }
    for(int i=1;i<=q;i++)cout<<(ans[i]?"Yes\n":"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...