Submission #1146198

#TimeUsernameProblemLanguageResultExecution timeMemory
1146198mannshah1211Curtains (NOI23_curtains)C++20
100 / 100
1107 ms80456 KiB
#include <bits/stdc++.h>

using namespace std;

#ifdef LOCAL
#include "deb.h"
#else
#define debug(...) 
#endif

class segtree {
 public:
  vector<int> tree, lazy, ands;
  int n;
  
  segtree(int _n) : n(_n) {
    tree.resize(4 * n);
    fill(tree.begin(), tree.end(), -1);
    lazy.resize(4 * n);
    ands.resize(4 * n);
  }
  
  void apply(int v, int x, bool prv) {
    lazy[v] = max(lazy[v], x);
    tree[v] = max(tree[v], x);
    if (prv) {
      ands[v] = true;
    }
  }
  
  void modify(int v, int l, int r, int ll, int rr, int x) {
    if (ll >= r || l >= rr) {
      return;
    }
    if (ll >= l && rr <= r) { 
      apply(v, x, true);
      return;
    }
    int m = (ll + rr) / 2;
    apply(2 * v + 1, lazy[v], ands[v]);
    apply(2 * v + 2, lazy[v], ands[v]);
    modify(2 * v + 1, l, r, ll, m, x);
    modify(2 * v + 2, l, r, m, rr, x);
    tree[v] = min(tree[2 * v + 1], tree[2 * v + 2]);
    ands[v] = ands[2 * v + 1] && ands[2 * v + 2];
  }
  
  pair<int, int> get(int v, int l, int r, int ll, int rr) {
    if (ll >= r || l >= rr) {
      return make_pair(int(1e9), true);
    }
    if (ll >= l && rr <= r) {
      return make_pair(tree[v], ands[v]);
    }
    int m = (ll + rr) / 2;
    apply(2 * v + 1, lazy[v], ands[v]);
    apply(2 * v + 2, lazy[v], ands[v]);
    pair<int, int> lc = get(2 * v + 1, l, r, ll, m);
    pair<int, int> rc = get(2 * v + 2, l, r, m, rr);
    return make_pair(min(lc.first, rc.first), lc.second && rc.second);
  }
};

void solve() {
  int n, m, q;
  cin >> n >> m >> q;
  vector<pair<int, int>> procs(m);
  for (int i = 0; i < m; i++) {
    cin >> procs[i].first >> procs[i].second;
    --procs[i].first; --procs[i].second;
  }
  vector<vector<pair<int, int>>> at(n);
  vector<vector<int>> rn(n);
  for (int i = 0; i < q; i++) {
    int l, r;
    cin >> l >> r;
    --l; --r;
    at[r].push_back(make_pair(l, i));
  }
  for (int i = 0; i < m; i++) {
    rn[procs[i].second].push_back(procs[i].first);
  }
  vector<bool> ans(q);
  segtree seg(n);
  vector<int> mx(n, -1);
  vector<bool> cov(n);
  for (int i = 0; i < n; i++) {
    for (int x : rn[i]) {
      seg.modify(0, x, i + 1, 0, n, x);
    }
    for (auto [k, idx] : at[i]) {
      ans[idx] = (seg.get(0, k, i + 1, 0, n).first >= k) && (seg.get(0, k, i + 1, 0, n).second);
    }
  }
  for (int i = 0; i < q; i++) {
    cout << (ans[i] ? "YES" : "NO") << '\n';
  }
}

int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  int t = 1;
  // cin >> t;
  while (t--) {
    solve();
  }
  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...