Submission #1202355

#TimeUsernameProblemLanguageResultExecution timeMemory
1202355zNatsumiOsumnjičeni (COCI21_osumnjiceni)C++20
0 / 110
1093 ms700 KiB
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>

using namespace std;
using namespace __gnu_pbds;

const int RANDOM = chrono::steady_clock::now().time_since_epoch().count();
struct chash{ int operator()(int x){ return x ^ RANDOM; } };

using ii = pair<int, int>;

const int N = 5e3 + 5;

int n, q, l[N], r[N], ri[N];
vector<int> rrh;

namespace IT{
  bool st[N<<3], lz[N<<3];

  void build(int tl, int tr, int i){
    st[i] = lz[i] = 0;
    if(tl == tr) return;
    int tm = tl + tr >> 1;
    build(tl, tm, i<<1);
    build(tm + 1, tr, i<<1|1);
  }

  void push(int i){
    if(!lz[i]) return;
    st[i<<1] |= lz[i];  st[i<<1|1] |= lz[i];
    lz[i<<1] |= lz[i];  lz[i<<1|1] |= lz[i];  lz[i] = 0;
  }

  void update(int l, int r, int tl, int tr, int i){
    if(r < tl || tr < l || l > r) return;
    if(l <= tl && tr <= r){
      st[i] = 1;
      lz[i] = 1;
      return;
    }
    push(i);
    int tm = tl + tr >> 1;
    update(l, r, tl, tm, i<<1);
    update(l, r, tm + 1, tr, i<<1|1);
    st[i] = st[i<<1] | st[i<<1|1];
  }
  bool get(int l, int r, int tl, int tr, int i){
    if(r < tl || tr < l || l > r) return 0;
    if(l <= tl && tr <= r) return st[i];
    push(i);
    int tm = tl + tr >> 1;
    return get(l, r, tl, tm, i<<1) | get(l, r, tm + 1, tr, i<<1|1);
  }
}

int32_t main(){
  cin.tie(0)->sync_with_stdio(0);
//  #define task "test"
//  if(fopen(task ".inp", "r")){
//    freopen(task ".inp", "r", stdin);
//    freopen(task ".out", "w", stdout);
//  }
  cin >> n;
  for(int i = 1; i <= n; i++) cin >> l[i] >> r[i];
  for(int i = 1; i <= n; i++){
    rrh.push_back(l[i]);
    rrh.push_back(r[i]);
  }
  sort(rrh.begin(), rrh.end());
  rrh.erase(unique(rrh.begin(), rrh.end()), rrh.end());
  for(int i = 1; i <= n; i++){
    l[i] = lower_bound(rrh.begin(), rrh.end(), l[i]) - rrh.begin() + 1;
    r[i] = lower_bound(rrh.begin(), rrh.end(), r[i]) - rrh.begin() + 1;
  }
  int lim = rrh.size();

  for(int i = 1; i <= n; i++){
    IT::build(1, lim, 1);
    for(int j = i; j <= n; j++){
      if(IT::get(l[j], r[j], 1, lim, 1)) break;
      IT::update(l[j], r[j], 1, lim, 1);
      ri[i] = j;
    }
  }

  cin >> q;
  while(q--){
    int u, v; cin >> u >> v;

    int res = 0;
    while(u <= v){
      res += 1;
      u = ri[u] + 1;
    }
    cout << res << "\n";
  }

  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...