fork download
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. typedef long long ll;
  6. typedef pair<int, int> ii;
  7.  
  8. const int INF = 1e9;
  9. const ll LINF = 1e18;
  10.  
  11. const int N = 2e5 + 5;
  12.  
  13. int n, m;
  14. int h[N], r[N];
  15.  
  16. int seg[4 * N];
  17.  
  18. void build(int id, int l, int r) {
  19. if (l == r) {
  20. seg[id] = h[l];
  21. return;
  22. }
  23. int mid = (l + r) >> 1;
  24. build(id * 2, l, mid);
  25. build(id * 2 + 1, mid + 1, r);
  26. seg[id] = max(seg[id * 2], seg[id * 2 + 1]);
  27. }
  28.  
  29. void update(int id, int l, int r, int pos, int val) {
  30. if (l > pos || r < pos) return;
  31. if (l == r) {
  32. seg[id] += val;
  33. return;
  34. }
  35. int mid = (l + r) >> 1;
  36. update(id * 2, l, mid, pos, val);
  37. update(id * 2 + 1, mid + 1, r, pos, val);
  38. seg[id] = max(seg[id * 2], seg[id * 2 + 1]);
  39. }
  40.  
  41. // Tìm khách sạn đầu tiên có số phòng >= x
  42. int getFirst(int id, int l, int r, int x) {
  43. if (seg[id] < x) return 0;
  44. if (l == r) return l;
  45. int mid = (l + r) >> 1;
  46. int res = getFirst(id * 2, l, mid, x);
  47. if (res == 0) res = getFirst(id * 2 + 1, mid + 1, r, x);
  48. return res;
  49. }
  50.  
  51. int where[N];
  52.  
  53. int main() {
  54. ios::sync_with_stdio(false);
  55. cin.tie(nullptr);
  56. cin >> n >> m;
  57. for (int i = 1; i <= n; i++) cin >> h[i];
  58. for (int i = 1; i <= m; i++) cin >> r[i];
  59.  
  60. build(1, 1, n);
  61.  
  62. for (int i = 1; i <= m; i++) {
  63. where[i] = getFirst(1, 1, n, r[i]);
  64. if (where[i] > 0) update(1, 1, n, where[i], -r[i]);
  65. }
  66.  
  67. for (int i = 1; i <= m; i++) cout << where[i] << ' ';
  68. }
Success #stdin #stdout 0.01s 7624KB
stdin
8 5
3 2 4 1 5 5 2 6
4 4 7 1 1
stdout
3 5 0 1 1