a53

radar

a53
Feb 7th, 2021 (edited)
106
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.28 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. const int DIMN = 100005;
  5. const int DIMQ = 300005;
  6.  
  7. int v[DIMN], t[DIMN], indices[DIMN];
  8. int st[DIMN], st_lim[DIMN], head = 0;
  9. pair<int, int> qs[DIMQ];
  10. int res[DIMQ];
  11.  
  12. bool is_better(int i, int j, int x) {
  13. return 1ULL * v[i] * (x - t[i]) <= 1ULL * v[j] * (x - t[j]);
  14. }
  15.  
  16. int intersect(int i, int j) {
  17. return (1LL * v[j] * t[j] - 1LL * v[i] * t[i]) / (v[j] - v[i]);
  18. }
  19.  
  20. int main() {
  21. int N, Q;
  22. assert(cin >> N >> Q);
  23. assert(1 <= N && N <= 100000 && 1 <= Q && Q <= 300000);
  24. for (int i = 1; i <= N; ++i) {
  25. assert(cin >> t[i] >> v[i]);
  26. assert(-1000000000 <= t[i] && t[i] <= 1000000000);
  27. assert(-1000000000 <= v[i] && v[i] <= 1000000000 && v[i] != 0);
  28. v[i] = (v[i] > 0 ? v[i] : -v[i]);
  29. indices[i] = i;
  30. }
  31.  
  32. sort(indices + 1, indices + N + 1,
  33. [](int a, int b) { return t[a] < t[b]; });
  34.  
  35. for (int i = 1; i <= Q; ++i) {
  36. assert(cin >> qs[i].first);
  37. assert(-1000000000 <= qs[i].first && qs[i].first <= 1000000000);
  38. qs[i].second = i;
  39. res[i] = -1;
  40. }
  41.  
  42. sort(qs + 1, qs + Q + 1);
  43.  
  44. int curr_q = 1;
  45. while (curr_q <= Q && qs[curr_q].first < t[indices[1]]) curr_q++;
  46.  
  47. for (int i = 1; i <= N; ++i) {
  48. int idx = indices[i];
  49. while (head) {
  50. if (st_lim[head] < t[idx] || is_better(idx, st[head], st_lim[head]))
  51. head--;
  52. else
  53. break;
  54. }
  55.  
  56. if (head == 0) {
  57. head = 1;
  58. st[1] = idx;
  59. st_lim[1] = 1000000000;
  60. } else {
  61. st[++head] = idx;
  62. st_lim[head] = intersect(idx, st[head - 1]);
  63. }
  64.  
  65. while (curr_q <= Q &&
  66. (i == N || qs[curr_q].first < t[indices[i + 1]])) {
  67. int q = qs[curr_q].first;
  68. int lef = 1, rig = head;
  69. while (lef <= rig) {
  70. int mid = (lef + rig) / 2;
  71. if (st_lim[mid] < q)
  72. rig = mid - 1;
  73. else
  74. lef = mid + 1;
  75. }
  76. res[qs[curr_q].second] = st[rig];
  77. curr_q++;
  78. }
  79. }
  80.  
  81. for (int i = 1; i <= Q; ++i) cout << res[i] << " \n"[i == Q];
  82.  
  83. return 0;
  84. }
Add Comment
Please, Sign In to add comment