fork download
  1. // ~~ icebear love atttttttttttt ~~
  2. #include <bits/stdc++.h>
  3. using namespace std;
  4.  
  5. typedef long long ll;
  6. typedef pair<int, int> ii;
  7. typedef pair<ii, int> iii;
  8.  
  9. #define FOR(i,a,b) for(int i=(a); i<=(b); ++i)
  10. #define FORR(i,a,b) for(int i=(a); i>=(b); --i)
  11. #define rep(i, n) for(int i=0; i<(n); ++i)
  12. #define red(i, n) for(int i=(n)-1; i>=0; --i)
  13. #define mp make_pair
  14. #define pb push_back
  15. #define fi first
  16. #define se second
  17. #define all(x) x.begin(), x.end()
  18. #define task "icebearat"
  19.  
  20. const int MOD = 1e9 + 7;
  21. const int inf = 1e9 + 27092008;
  22. const ll LLinf = 1e18 + 27092008;
  23. const int N = 4e5 + 5;
  24. int n, q, par[N][19];
  25. ii range[N];
  26. vector<int> compress;
  27. int curId = 0;
  28. int st[N << 2], lazy[N << 2];
  29.  
  30. void pushDown(int id) {
  31. int &t = lazy[id];
  32. if (t) {
  33. st[id << 1] += t;
  34. lazy[id << 1] += t;
  35. st[id << 1 | 1] += t;
  36. lazy[id << 1 | 1] += t;
  37. t = 0;
  38. }
  39. }
  40.  
  41. void update(int id, int l, int r, int u, int v, int k) {
  42. if (l > v || r < u) return;
  43. if (u <= l && r <= v) {
  44. st[id] += k;
  45. lazy[id] += k;
  46. return;
  47. }
  48. pushDown(id);
  49. int mid = (l + r) >> 1;
  50. update(id << 1, l, mid, u, v, k);
  51. update(id << 1 | 1, mid + 1, r, u, v, k);
  52. st[id] = max(st[id << 1], st[id << 1 | 1]);
  53. }
  54.  
  55. int getMax(int id, int l, int r, int u, int v) {
  56. if (l > v || r < u) return 0;
  57. if (u <= l && r <= v) return st[id];
  58. pushDown(id);
  59. int mid = (l + r) >> 1;
  60. return max(getMax(id << 1, l, mid, u, v),
  61. getMax(id << 1 | 1, mid + 1, r, u, v));
  62. }
  63.  
  64. void init() {
  65. cin >> n;
  66. FOR(i, 1, n) cin >> range[i].fi >> range[i].se, compress.pb(range[i].fi), compress.pb(range[i].se);
  67.  
  68. sort(all(compress));
  69. compress.resize(unique(all(compress)) - compress.begin());
  70.  
  71. FOR(i, 1, n) {
  72. range[i].fi = lower_bound(all(compress), range[i].fi) - compress.begin() + 1;
  73. range[i].se = lower_bound(all(compress), range[i].se) - compress.begin() + 1;
  74. }
  75. }
  76.  
  77. void prepare() {
  78. int j = n;
  79. memset(par, 0x3f, sizeof par);
  80. FORR(i, n, 1) {
  81. while(getMax(1, 1, N - 5, range[i].fi, range[i].se)) {
  82. update(1, 1, N - 5, range[j].fi, range[j].se, -1);
  83. j--;
  84. }
  85. update(1, 1, N - 5, range[i].fi, range[i].se, +1);
  86. par[i][0] = j + 1;
  87. }
  88.  
  89. FOR(j, 1, 18) FOR(i, 1, n + 1)
  90. if (par[i][j - 1] <= n + 1) par[i][j] = par[par[i][j - 1]][j - 1];
  91. }
  92.  
  93. void solve() {
  94. init();
  95. prepare();
  96. cin >> q;
  97. while(q--) {
  98. int l, r;
  99. cin >> l >> r;
  100. int ans = 0;
  101. FORR(j, 18, 0) {
  102. if (l <= r && par[l][j] - 1 <= r) {
  103. ans += (1 << j);
  104. l = par[l][j];
  105. }
  106. }
  107. if (l <= r) ans++;
  108. cout << ans << '\n';
  109. }
  110. }
  111.  
  112. int main() {
  113. ios_base::sync_with_stdio(0);
  114. cin.tie(0); cout.tie(0);
  115. if (fopen(task".inp", "r")){
  116. freopen(task".inp", "r", stdin);
  117. freopen(task".out", "w", stdout);
  118. }
  119. int tc = 1;
  120. // cin >> tc;
  121. while(tc--) solve();
  122. return 0;
  123. }
  124.  
Success #stdin #stdout 0.01s 35408KB
stdin
Standard input is empty
stdout
Standard output is empty