Submission #1171223

#TimeUsernameProblemLanguageResultExecution timeMemory
1171223KhoaDuyCurtains (NOI23_curtains)C++20
100 / 100
458 ms59728 KiB
#include<bits/stdc++.h>
using namespace std;
#define endl '\n'
struct T{
    int l=-1,r=-1;
};
T Tid;
T TT(T &le,T &ri){
    T pa;
    if(le.l==-1){
        pa=ri;
        return pa;
    }
    if(ri.l==-1){
        pa=le;
        return pa;
    }
    if(le.r+1>=ri.l){
        pa.r=max(le.r,ri.r);
        pa.l=le.l;
    }
    else{
        pa=ri;
    }
    return pa;
}
struct segtree{
    vector<T> seg;
    int n,lg;
    void refresh(int v){
        seg[v]=TT(seg[v<<1],seg[(v<<1)|1]);
    }
    void build(int siz){
        n=1;
        while(n<siz){
            n<<=1;
        }
        lg=__lg(n);
        seg.assign(n<<1,Tid);
    }
    void update(int l,int r){
        l+=n;
        seg[l].l=l-n,seg[l].r=max(seg[l].r,r);
        for(int i=1;i<=lg;i++){
            refresh(l>>i);
        }
    }
    T query(int l,int r){
        l+=n,r+=n;
        T le=Tid,ri=Tid;
        for(;l<r;l>>=1,r>>=1){
            if(l&1){
                le=TT(le,seg[l]);
                l++;
            }
            if(r&1){
                r--;
                ri=TT(seg[r],ri);
            }
        }
        return TT(le,ri);
    }
};
signed main(){
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    int n,m,q;
    cin >> n >> m >> q;
    segtree seg;
    seg.build(n+1);
    bool ans[q];
    vector<vector<pair<int,int>>> que(n+1);
    vector<vector<int>> group(n+1);
    while(m--){
        int l,r;
        cin >> l >> r;
        group[r].push_back(l);
    }
    for(int i=0;i<q;i++){
        int s,e;
        cin >> s >> e;
        que[e].push_back({s,i});
    }
    for(int r=1;r<=n;r++){
        for(int l:group[r]){
            seg.update(l,r);
        }
        for(pair<int,int> &x:que[r]){
            int l=x.first,idx=x.second;
            T curr=seg.query(l,r+1);
            if(curr.l==l&&curr.r==r){
                ans[idx]=true;
            }
            else{
                ans[idx]=false;
            }
        }
    }
    for(int i=0;i<q;i++){
        if(ans[i]){
            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...