제출 #1331165

#제출 시각아이디문제언어결과실행 시간메모리
1331165quangadhcCurtains (NOI23_curtains)C++20
0 / 100
1 ms348 KiB

#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define ld long double
#define el '\n'
#define fi first
#define se second
#define pb push_back
#define FOR(i,l,r) for(ll i=(l),_r=(r);i<=_r;i++)
#define FORNG(i,r,l) for(ll i=(r),_l=(l);i>=_l;i--)
#define MASK(i) (1LL<<(i))
#define BIT(x,i) (((x)>>(i))&1LL)
#define all(v) (v).begin(),(v).end()
#define sz(v) ((ll)(v).size())
const ll mod = 0 ;
const ll maxn = 5e5+5 ;
const ll base = 36366 ;
ll baserem[maxn];
ll seg[4*maxn]; 
ll res[maxn];
pair < ll , ll > rem[maxn ] ; 
ll lazy[4*maxn];
ll seglz[4*maxn] ; 
mt19937_64 rd(time(0));
long long rand(long long l, long long r) {
    return l + rd() % (r - l + 1);
}
void update ( ll l, ll r, ll id , ll idx , ll val ) 
{
    if ( r < idx || idx<l) return ;
    if ( l == r )
    {
        seg[id ] += val ; 
        return ;
    }
    ll mid = (l+r ) /2;
    update ( l , mid ,  id *2 , idx ,val ) ; 
    update ( mid +1 , r, id *2 +1 , idx, val ) ; 
    seg[id ] =seg[id *2 ] + seg[id *2 +1 ] ;
}
ll get ( ll l, ll r, ll id , ll u , ll v ) 
{
    if (r  <u || v< l ) 
    {
        return 0 ; 
    }
    if ( u<=l && r <= v ) 
    {
        return seg[id] ; 
    }
    ll mid = (l+r ) /2;
    return get ( l , mid , id *2 , u , v) + get ( mid +1 , r, id *2 +1 , u , v ) ; 
}
void push (ll l , ll r ,ll id ) 
{
    if ( l== r || lazy[id ]== 0 ) return ; 
    ll &u = lazy[id] ; 
    lazy[id*2] = u ; 
    lazy[id*2+1] = u ;
    seglz[id*2] = u ; 
    seglz[id *2 +1 ]= u ;
    u =0 ;  
}
void updatelz ( ll l,  ll r, ll id , ll u , ll v, ll val ) 
{
    if ( r < u || v<l ) return ;
    if ( u<=l && r <=v ) 
    {
        seglz[id ] = val ; 
        lazy[id ] = val ;
        return ;  
    }
    push ( l , r ,id ) ; 
    ll mid =(l+r ) /2;
    updatelz ( l , mid , id *2 , u , v ,val ) ;
    updatelz ( mid +1 , r ,id *2 +1 , u , v, val ) ; 
    seglz[id] = max ( seglz[id*2] , seglz[id*2+1 ] ) ; 
}
ll getlz ( ll l , ll r ,ll id , ll u , ll v ) 
{
    if ( r < u || v< l ) 
    {
        return -1e18;
    }
    if ( u<=l && r <=v ) 
    {
        return seglz[id] ; 
    }
    push ( l , r ,id ) ; 
    ll mid = (l+r ) /2;
    return max(getlz ( l , mid , id *2 , u , v) , getlz ( mid +1 , r ,id*2+1 , u , v )) ; 
}
int main()
{
    ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    //freopen(".inp", "r", stdin);
    //freopen(".out", "w", stdout);
    ll n,m ,q;
    cin >>n >> m>> q;
    vector < array<ll,3 >> query;
    for (int i=1; i<=m; i ++ ) 
    {
        ll u ,v;
        cin >> u >> v;
        rem[i]= {u,v } ; 
        ll ran=rand (1, 10000000 );
        ll num= base *  ran ;
        // cout<<num<<el;
        update (1, n ,1 , u , num ) ; 
        update  (1, n ,1 , v, -num) ;
        updatelz (1, n , 1, u , v , -1e18 ) ; 
        baserem[i] = num;  
    }    
    // cout<<getlz(1, n , 1, 1, 5)<<el;
    for (int i=1 ; i<=q; i ++ ) 
    {
        ll l , r ; cin >> l >> r; 
        query.pb({l,r,i} ) ; 
    }
    ll idx = 1 ; 
    sort (all(query)) ; 
    for (auto[l, r ,id ] : query ) 
    {
        while (idx<=m && rem[idx].fi < l )
        {
            // cout<<idx<<el;
            ll num = baserem[idx];
            update ( 1, n , 1 , rem[idx].fi , -num ) ; 
            update ( 1, n , 1, rem[idx].se, num) ;
            updatelz ( 1, n ,1 , rem[idx].fi , rem[idx].se , 1e18) ;  
            idx ++ ; 
        } 
        if (rem[idx].fi != l ) 
        {
            continue ; 
        }
        if (get ( 1 , n , 1, l , r) ==0 && getlz(1, n , 1, l, r) == -1e18) 
        {
            // cout<< l << " " << r << " " << get ( 1 , n , 1, l , r)<< el ;
            res[id] = 1; 
        }
    }
    for (int i=1 ; i<=q; i ++ ) 
    {
        if ( res[i] ) 
        {
            cout<<"YES";
        }
        else cout<<"NO";
        cout<<el; 
    }
}
#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...