Submission #1184909

#TimeUsernameProblemLanguageResultExecution timeMemory
1184909epicci23Curtains (NOI23_curtains)C++20
100 / 100
808 ms82872 KiB
#include "bits/stdc++.h"
#define int long long
#define all(v) v.begin() , v.end()
#define sz(a) (int)a.size()
using namespace std;

const int N = 5e5 + 5;
const int INF = 1e18;

int lazy[4*N], mn[4*N], mx[4*N];

void build(int rt,int l,int r){
  mn[rt] = mx[rt] = INF;
  if(l == r) return;
  int mid = (l + r) / 2;
  build(rt * 2, l, mid), build(rt * 2 + 1, mid + 1, r);
}

inline void push(int rt,int l,int r){
  if(!lazy[rt]) return;
  mn[rt] = mx[rt] = lazy[rt];
  if(l == r){
  	lazy[rt] = 0;
  	return;
  }
  lazy[rt * 2] = lazy[rt * 2 + 1] = lazy[rt];
  lazy[rt] = 0;
}


void upd(int rt,int l,int r,int gl,int gr,int u){
  push(rt, l, r);
  if(r < gl || l > gr || mx[rt] <= u) return;
  if(l >= gl && r <= gr && mn[rt] >= u){
   lazy[rt] = u;
   push(rt, l, r);
   return;
  }

  int mid = (l + r) / 2;
  upd(rt * 2, l, mid, gl, gr, u);
  upd(rt * 2 + 1, mid + 1, r, gl, gr, u);

  mn[rt] = min(mn[rt * 2], mn[rt * 2 + 1]);
  mx[rt] = max(mx[rt * 2], mx[rt * 2 + 1]);
}

int query_min(int rt,int l,int r,int gl,int gr){
  push(rt, l, r);
  if(r < gl || l > gr) return INF;
  if(l >= gl && r <= gr) return mn[rt];
  int mid = (l + r) / 2;
  return min(query_min(rt * 2, l, mid, gl, gr), query_min(rt * 2 + 1, mid + 1, r, gl, gr));
}

int query_max(int rt,int l,int r,int gl,int gr){
  push(rt, l, r);
  if(r < gl || l > gr) return -INF;
  if(l >= gl && r <= gr) return mx[rt];
  int mid = (l + r) / 2;
  return max(query_max(rt * 2, l, mid, gl, gr), query_max(rt * 2 + 1, mid + 1, r, gl, gr));
}

void _(){
  int n, m, q;
  cin >> n >> m >> q;

  vector<int> Perde[n+5];
  for(int i=1;i<=m;i++){
    int l, r;
    cin >> l >> r;
    Perde[l].push_back(r);
  }

  vector<array<int,2>> Query[n+5];
  vector<int> ans(q+5,0);
  for(int i=1;i<=q;i++){
    int l, r;
    cin >> l >> r;
    Query[l].push_back({r, i});
  }

  build(1, 1, n);

  for(int i=n;i>=1;i--){
    for(int u : Perde[i]) upd(1,1,n,i,u,u);

    for(auto [u, ind] : Query[i]){
      int xd = query_max(1, 1, n, i, u);
      if(xd > u) ans[ind] = 0;
      else ans[ind] = 1;
    }
  }

  for(int i=1;i<=q;i++){
     if(ans[i]) cout << "YES\n";
     else cout << "NO\n";
  }
}

int32_t main(){
  cin.tie(0); ios::sync_with_stdio(0);
  int tc=1;//cin >> tc;
  while(tc--) _();
  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...