fork download
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. typedef long long ll;
  5. typedef pair<int, int> ii;
  6.  
  7. const int INF = 1e9;
  8. const ll LINF = 1e18;
  9.  
  10. const int MX = 1e6;
  11.  
  12. int n, q;
  13. int nxt[20][MX + 5];
  14.  
  15. int main() {
  16. ios::sync_with_stdio(0); cin.tie(0);
  17. cin >> n >> q;
  18.  
  19. // nxt[0][a] = thời điểm kết thúc của bộ phim có thời điểm kết thúc sớm nhất
  20. // trong số tất cả các bộ phim có thể xem tính từ thời điểm a
  21. for (int a = 1; a <= MX + 1; a++) nxt[0][a] = MX + 1;
  22.  
  23. for (int i = 0; i < n; i++) {
  24. int a, b;
  25. cin >> a >> b;
  26. nxt[0][a] = min(nxt[0][a], b);
  27. }
  28.  
  29. for (int a = MX; a >= 1; a--) {
  30. nxt[0][a] = min(nxt[0][a], nxt[0][a + 1]);
  31. }
  32.  
  33. for (int k = 1; k <= 19; k++) {
  34. for (int a = 1; a <= MX + 1; a++) {
  35. nxt[k][a] = nxt[k - 1][nxt[k - 1][a]];
  36. }
  37. }
  38.  
  39. while (q--) {
  40. int a, b;
  41. cin >> a >> b;
  42.  
  43. // Dễ thấy số bước nhảy tối đa có thể nhảy từ thời điểm a sao cho không vượt quá thời điểm b
  44. // cũng chính là số bộ phim nhiều nhất có thể xem.
  45. int ans = 0;
  46. for (int k = 19; k >= 0; k--) {
  47. if (nxt[k][a] <= b) {
  48. ans += (1 << k);
  49. a = nxt[k][a];
  50. }
  51. }
  52.  
  53. cout << ans << '\n';
  54. }
  55. }
Success #stdin #stdout 0.03s 81760KB
stdin
4 3
2 5
6 10
4 7
9 10
5 9
2 10
7 10
stdout
0
2
1