제출 #1182350

#제출 시각아이디문제언어결과실행 시간메모리
1182350asli_bgCurtains (NOI23_curtains)C++20
0 / 100
48 ms106124 KiB
#include<bits/stdc++.h>
using namespace std;

#include <ext/pb_ds/assoc_container.hpp>
using namespace __gnu_pbds;

#define int long long

typedef pair<int,int> pii;
typedef vector<pii> vii;
typedef vector<int> vi;
typedef vector<bool> vb;

#define FOR(i,a) for(int i=0;i<(a);i++)
#define FORE(i,a,b) for(int i=(a);i<(b);i++)

#define all(x) x.begin(),x.end()
#define fi first
#define se second
#define pb push_back
#define sp <<" "<<

#define cont(x) for(auto el:x) cout<<el<<' ';cout<<endl;
#define contp(x) for(auto el:x) cout<<el.fi<<'-'<<el.se<<' ';cout<<endl;

#define DEBUG(x) cout<<#x sp x<<endl;
#define carp(x,y) ((x%MOD)*(y%MOD))%MOD
#define topla(x,y) ((x%MOD)+(y%MOD))%MOD
#define mid (l+r)/2

const int MAXN=5e5+5;
const int MOD=1e9+7;
const int INF=1e18;

int n,m,q;

vii ar;

vii tut[MAXN];

vii t[4*MAXN];
vii pref[4*MAXN]; //{boşluk,gidebilecek en uzak mesafe}

void merge(vii& c,vii& a, vii& b,int nd,int l,int r){
    int sz1=a.size();
    int sz2=b.size();

    int p1,p2;
    p1=p2=0;

    int bir,iki;
    bir=-1;
    iki=-1;

    vi vec;

    while(p1<sz1 or p2<sz2){
        if(p1>=sz1 or (p2<sz2 and a[p1].fi>b[p2].fi)){
            while(!vec.empty() and vec.back()>=ar[b[p2].se].fi) vec.pop_back();

            if(!c.empty()){
                if(c.back().fi+1<ar[b[p2].se].fi){
                    vec.pb(ar[b[p2].se].fi-1);
                }
            }
            else{
                if(ar[b[p2].se].fi>l){
                    vec.pb(ar[b[p2].se].fi-1);
                }
            }

            iki=max(pref[nd*2+1][p2].se,iki);
            if(iki<r){
                vec.pb(r);
            }

            if(!vec.empty()) bir=vec.back();
            else bir=-1;

            c.pb(b[p2++]);
        }
        else{
            while(!vec.empty() and vec.back()>=ar[a[p1].se].fi) vec.pop_back();
            
            iki=max(pref[nd*2][p1].se,iki);
            if(iki<r){
                vec.pb(r);
            }

            if(!vec.empty()) bir=vec.back();
            else bir=-1;

            c.pb(a[p1++]);
        }
        pref[nd].pb({bir,iki});
    }
}

void build(int nd=1,int l=1,int r=n){
    if(l==r){
        int bir,iki;
        bir=l;
        iki=-1;
        for(auto el:tut[l]){
            t[nd].pb(el);
            bir=-1;
            iki=max(iki,el.fi);
            pref[nd].pb({bir,iki});
        }
        return;
    }

    build(nd*2,l,mid);
    build(nd*2+1,mid+1,r);

    merge(t[nd],t[nd*2],t[nd*2+1],nd,l,r);
}

pii query(int ql,int qr,int nd=1,int l=1,int r=n){
    if(l>r or l>qr or r<ql) return {-1,-1};
    
    pii res;
    if(ql<=l and r<=qr){
        if(t[nd].empty()) res={r,-1};
        else{
            pii pp={qr,INF};
            auto it=upper_bound(all(t[nd]),pp);
            if(it==t[nd].begin()) res={r,-1};
            else{
                it--;
                res=pref[nd][it-t[nd].begin()];
            }
        }

        return res;
    }
    
    if(qr<=mid) return query(ql,qr,nd*2,l,mid);
    else if(ql>mid) return query(ql,qr,nd*2+1,mid+1,r);
    else{
        auto s1=query(ql,qr,nd*2,l,mid);
        auto s2=query(ql,qr,nd*2+1,mid+1,r);

        pii res;

        if(s1.fi!=-1) res.fi=s1.fi;
        else if(s2.fi!=-1){
            if(s1.se>=s2.fi) res.fi=-1;
            else res.fi=s2.fi;
        }
        else res.fi=-1;

        res.se=max(s1.se,s2.se);

        return res;
    }
}

bool mm(pii a,pii b){
    return a.se<b.se;
}

signed main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    
    cin>>n>>m>>q;
    ar.resize(m+1);
    FORE(i,1,m+1){
        cin>>ar[i].fi>>ar[i].se;
    }

    sort(all(ar),mm);

    FORE(i,1,m+1) tut[ar[i].fi].pb({ar[i].se,i});
    
    build();

    while(q--){
        int l,r;
        cin>>l>>r;

        auto ans=query(l,r);

        if(ans.fi==-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...